接口测试 简述 Python 类中的`__init__`、`__new__`、`__call__`方法

meiyo · 2018年03月06日 · 484 次阅读

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
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册