类的定制
__str__
首先看个例子:
>>> class Student(object): ... def __init__(self, name): ... self.name = name ... >>> print(Student('Michael')) <__main__.Student object at 0x109afb190>
这样打印出的不好看, 给它定制一下:
>>> class Student(object): ... def __init__(self, name): ... self.name = name ... def __str__(self): ... return 'Student object (name: %s)' % self.name ... >>> print(Student('Michael')) Student object (name: Michael)
如果不用print()打印,显示的还是不好看:
>>> s = Student('Michael') >>> s <__main__.Student object at 0x109afb310>
这是因为直接显示调用 的不是__str__,而是__repr__(), 再定义一个__repr__()就行了,写法跟__str__完全一样。还有个简单的写法:
class Student(object): def __init__(self, name): self.name = name def __str__(self): return 'Student object (name=%s)' % self.name __repr__ = __str__
__iter__
用类来实现肥波纳妾, 并可以迭代:
class Fib(object): def __init__(self): self.a, self.b = 0, 1 # 初始化两个计数器a,b def __iter__(self): return self # 实例本身就是迭代对象,故返回自己 def __next__(self): self.a, self.b = self.b, self.a + self.b # 计算下一个值 if self.a > 100000: # 退出循环的条件 raise StopIteration(); return self.a # 返回下一个值
__getattr__
如果调用一个不存在的属性或方法,就会报错; 想要实现当调用 一个不存在的方法或属性时,给它返回自定义的内容。那就是再写一个__getattr__()方法:
class Student(object): def __init__(self): self.name = 'Michael' def __getattr__(self, attr): if attr=='score': return 99 >>> s = Student() >>> s.name 'Michael' >>> s.score 99
如果我们调用其它的不存在的属性时,则会返回None,因为我们定义的__getattr__() 返回的就是None, 所以我们可以让__getattr__()响应特定属性的请求,其它的抛出AttributeError错误
class Student(object): def __getattr__(self, attr): if attr=='age': return lambda: 25 raise AttributeError('\'Student\' object has no attribute \'%s\'' % attr)
__call()__
当我们执行一个实例时,自动调用的方法:
class Student(object): def __init__(self, name): self.name = name def __call__(self): print('My name is %s.' % self.name) >>> s = Student('Michael') >>> s() # self参数不要传入 My name is Michael.
这样的调用方式和函数是一样的,那我们要怎么区分一个变量是函数还是实例呢?
>>> callable(Student()) True >>> callable(max) True >>> callable([1, 2, 3]) False >>> callable(None) False >>> callable('str') False