-
注意:要想将文件写成多行,要在每一行的后面加上换行符\n
查看全部 -
read(n)读取n个字符
readline()读一行
readlines(n)读n行,以列表形式返回
读取一个文件,并把文件内容打印出来
with open('requirements.txt','r') as f: lines = f.readlines() print(lines) txt = '' for line in lines: txt += line print(txt) ==> ['paddlepaddle==2.3.2\n', 'paddlenlp==2.4.1\n', 'regex\n', 'fastcore\n', 'scikit-image'] paddlepaddle==2.3.2 paddlenlp==2.4.1 regex fastcore scikit-image
注意:
换行符也是字符!
查看全部 -
在Python中,模块(功能模块)就是一个.py文件
查看全部 -
__call__()
工作原理:
当你尝试以函数的方式调用一个对象时,Python会自动查找该对象的__call__()。
class Fib(object): def __init__(self): pass def __call__(self,n): fib_list = [] a,b = 0,1 for i in range(n): fib_list.append(a) a,b = b,a+b return fib_list f = Fib() print(f(10)) ==> [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
f(10) == f.__call__(10)
查看全部 -
Python是动态语言,实例可动态添加属性
student.age = 12
__slots__是一个特殊的内置类属性,用于限定实例属性
用法:
__slots__ = ('属性1', '属性2'...)
class Person(object): __slots__ = ('name','gender') def __init__(self,name,gender): self.name = name self.gender = gender class Student(Person): __slots__ = ('score') def __init__(self,name,gender,score): super().__init__(name,gender) self.score = score s = Student('Alice','gril',27) s.age = 18 ==>AttributeError
__slots__的继承
在上面的例子中,Student 类继承了 Person 类的 slots,同时额外定义了一个 score 属性。这意味着 Student 类的实例只能拥有 name、age 和 score 这三个属性。
查看全部 -
Rational类的四则运算 class Rational(object): def __init__(self, p, q): self.p = p self.q = q def __add__(self, r): return Rational(self.p * r.q + r.p * self.q, self.q * r.q) def __sub__(self, r): return Rational(self.p * r.q - r.p * self.q, self.q * r.q) def __mul__(self, r): return Rational(self.p * r.p, self.q * r.q) def __truediv__(self, r): return Rational(self.p * r.q, self.q * r.p) def __str__(self): return '{}/{}'.format(self.p, self.q) r1 = Rational(1, 2) r2 = Rational(2, 3) print(r1 + r2,r1-r2,r1*r2,r1/r2) ==> 7/6 -1/6 2/6 3/4
解释:
1、r1 + r2 相当于 r1.add(r2) r1调用__add__(self,r2)
2、可以在实例方法中创建本类的实例对象
查看全部 -
对于内建对象(int, list, tuple, dict...),通过str()可以把对象转换为字符串对象输出
num = 12
str(num) ==> '12'l = [1,2,3,4,5]
str(l) ==> '[1, 2, 3, 4, 5]'t = ('Alice',17)
str(t) ==> '('Alice', 17)'
d = {1: 1, 2: 2}
str(d) ==> '{1: 1, 2: 2}'对于自定义对象,需要重新定义内建方法__str__()输出你想输出的内容
查看全部 -
斐波那契数列是由 0, 1, 1, 2, 3, 5, 8...构成。
请编写一个Fib类,Fib(10)表示数列的前10个元素,print Fib(10) 可以打印出数列的前 10 个元素,len(Fib(10))可以正确返回数列的个数10。
class Fib(object): def __init__(self,n): self.fib_list = [] a,b = 0,1 for i in range(n): self.fib_list.append(a) a,b = b,a+b def __str__(self): return str(self.fib_list) def __len__(self): return len(self.fib_list) f = Fib(10) print(f) print(len(f)) ==> [0, 1, 1, 2, 3, 5, 8, 13, 21, 34] 10
查看全部 -
单继承
class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender class Teacher(Person): def __init__(self,name,gender,subject): super(Teacher,self).__init__(name,gender) self.subject = subject t = Teacher('Bob','boy','english') print(t.name,t.gender,t.subject) ==>Bob boy english
多重继承
多重继承的目的是从两种继承树中分别选择并继承出子类,以便组合功能使用。
举个例子,Python的网络服务器有TCPServer、UDPServer、UnixStreamServer、UnixDatagramServer,而服务器运行模式有多进程ForkingMixin和多线程ThreadingMixin两种。
要创建多进程模式的 TCPServer:class MyTCPServer(TCPServer, ForkingMixin)
pass要创建多线程模式的 UDPServer:
class MyUDPServer(UDPServer, ThreadingMixin):
pass如果没有多重继承,实现上述所有可能的组合需要 4x2=8 个类。
例:
已知类Student继承Person类,技能类BasketballMixin继承SkillMixin类,请通过多重继承,定义“会打篮球的学生”
class Person(object): def __init__(self, name, age): self.name = name self.age = age class SkillMixin(object): def __init__(self, club): self.club = club class BasketballMixin(SkillMixin): def __init__(self, club): super(BasketballMixin, self).__init__(club) class Student(Person, BasketballMixin): def __init__(self, name, age, score, club): super(Student, self).__init__(name, age, club) self.score = score s = Student('Alice', 17, 98, 'ax') print(s.name, s.age, s.score,s.club)
class Student(Person, BasketballMixin): def __init__(self, name, age, score, club): super().__init__(name, age) #等于super(Student,self)... super(Person,self).__init__(club) self.score = score s = Student('Alice', 17, 98, 'ax') print(s.name, s.age, s.score,s.club) ==>Alice 17 98 ax
错误理解:
super().__init__() 会调用所有父类的__init__方法
正确理解:
super(type, object_or_type=None)
object_or_type 确定要用于搜索的 method resolution order。 搜索会从 type 之后的类开始。
举例来说,如果 object_or_type 的 __mro__ 为 D -> B -> C -> A -> object 并且 type 的值为 B,则 super() 将会搜索 C -> A -> object。
查看全部 -
isinstance(变量, 类型)判断变量是否为该类型
例:
isinstance(2,int)==>True
查看全部 -
操作实例的私有属性
==>定义实例方法
class Person(object): def __init__(self, name): self.__name = name def get_name(self): return self.__name def set_name(self,name): self.__name = name p = Person('Alice') print(p.get_name()) p.set_name('Bob') print(p.get_name()) ==> Alice Bob
查看全部 -
操作类的私有属性
==>定义类方法
class Animal(object): __count = 0 @classmethod def get_count(cls): return cls.__count @classmethod def set_count(cls,count): cls.__count = count print(Animal.get_count()) Animal.set_count(2) print(Animal.get_count()) ==> 0 2
和实例方法不同的:
1、需要使用@classmethod来标记为类方法,否则定义的还是实例方法
2、类方法的第一个参数将传入类本身,通常将参数名命名为 cls,上面的 cls.__localtion 实际上相当于Animal.__localtion。
查看全部 -
私有属性:以双下划线'__'开头
# 类私有属性
class Animal(object):
__localtion = 'Asia'
print(Animal.__localtion)==>type object 'Animal' has no attribute '__localtion'
# 实例私有属性
class Animal(object):
def __init__(self, localtion):
self.__localtion = localtion
dog = Animal('GuangDong')
print(dog.__localtion)==>'Animal' object has no attribute '__localtion'
查看全部 -
请给 Animal类添加一个类属性 count,每创建一个实例,count 属性就加 1,这样就可以统计出一共创建了多少个 Animal的实例。
class Animal(object): count = 0 def __init__(self): count += 1 dog = Animal() cat = Animal() print(Animal.count) ==>local variable 'count' referenced before assignment
class Animal(object): count = 0 def __init__(self): Animal.count += 1 dog = Animal() cat = Animal() print(Animal.count) ==>2
问:
为什么在类方法中不能直接访问类属性,而是要通过"类.类属性"?
答:
如果你不加“类.”,他会认为count是__init__方法中的一个局部变量,就会出现上面的错误:变量count未定义就使用
所以请注意:
在类方法中引用类属性也要通过"类.类属性"的方式!!!
查看全部 -
类方法的第一个参数必须是self,但是在调用时不必传入相应的参数。
self指的是类实例对象本身,不是类本身。
查看全部
举报