Python3 中,类默认继承了object
。本文讨论的类的方法基于 Python3 讨论。
__init__
和__new__
方法__new__
返回一个实例对象,__init__
方法负责实例对象的初始化。
class A:
def __init__(self, a=0, b=0):
print('__int__')
print(self)
self.a = a
self.b = b
c = super(A, self).__init__()
print(c)
def __new__(cls):
print('__new__')
self = super(A, cls).__new__(cls)
print(self)
return self
A()
运行结果:
__new__
<__main__.A object at 0x0000018B4AF15128>
__int__
<__main__.A object at 0x0000018B4AF15128>
None
Process finished with exit code 0
从输出结果来看,__new__
方法返回类的实例对象,这个实例对象传给__int__
方法中定义的self
参数。
若__new__
方法返回None
,则不会调用__init__
方法。此外 i,Python 规定,__init__
方法只能返回None
,否则会报错。
__call__
方法如果在类中实现了__call__
方法,那么类的实例对象会成为一个可调用对象(callable)。函数callable
判断对象是否是可调用对象。
class B:
def __call__(self):
print('__call__')
if __name__ == '__main__':
b = B()
print(callable(b))
b()
运行结果:
True
__call__
下面的例子实现了记录函数被调用的次数:
class Counter:
def __init__(self, func):
self.func = func
self.count = 0
def __call__(self, *args, **kwargs):
self.count += 1
return self.func(*args, **kwargs)
@Counter
def foo():
pass
for i in range(10):
foo()
print(foo.count) #10