在python中,名字形如__xxx__的函数或方法,可以给类定制一些特殊的属性,使该类的实例在调用方法和属性的时候更简单方便。
下面给Student类添加各种。
class Student(object): #下面是各种方法 #实例对象: stu = Student()
1,__slots__
作用:限制实例的属性范围,要求实例只能给哪几个属性赋值,不能继承给子类
参数:无。这是一个类的属性
__slots__ = ('name', 'age') stu.name = "Curry" # 正确 stu.age = 28 # 正确 stu.number = 35 # 错误,发生AttributeError异常
给__slots__赋予了一个不可变的列表。该__slots__是限制Student实例只能有name和age两个属性
2,__str__
作用:打印实例时,打印出的是该实例__str__方法中返回的字符串。
参数:只有一个self
def __str__(self): return 'this student name is %s, age is %s' % (self.name, self.age) print(stu)
结果为:
this student name is Curry, age is 28
3,__getattr__
作用:实例在调用未定义的一个属性或方法时,就会报错,使用getattr可以给这些未定义的属性或方法指定一个默认值
参数:两个,一个是对象本身,self,另一个是attr,为实例调用的该实例不存在的属性的字符串形势。
def __getattr__(self, attr): if attr=='number': return 35 else: return attr print(stu.number) print(stu.hahahaha)
结果为:
35 hahahaha
刚刚在__getattr__中定义了,如果该不存在的属性是number,则返回35,否则,返回该不存在属性本身
4,__iter__,__next__
作用:可以实现实例的迭代,iter返回的是迭代的对象,迭代该实例时,会不断调用next,知道next返回StopIteration
参数:iter和next都是self
def __iter__(self): return self def __next__(self): self.age += 1 if self.age > 50: raise StopIteration() return self.name + str(self.age) for value in stu: print(value)
结果为:
Curry29 Curry30 Curry31 Curry32 Curry33 Curry34 Curry35 Curry36 Curry37 Curry38 Curry39 Curry40 Curry41 Curry42 Curry43 Curry44 Curry45 Curry46 Curry47 Curry48 Curry49 Curry50 Curry52
根据next中的定义,只有当self.age>50使,该循环才会结束,否则,按next返回的值依次输出
5,__call__
作用:定义一个以实例自己的名字为方法名,直接调用该名字的方法。
参数:self
def __call__(self): print('name is %s, age is %s, number is %s' % (self.name, self.age, self.number)) stu()
结果为:
name is Curry, age is 29, number is 35
__call__返回的是该实例当时的name,age等等,如果之前就改变了name, age的值,结果会不同