在看源码的时候看到__call__不是很明白原理,所以在这里记录下
通常来说__call__的调用时实例后面的"()"引起的他自身的调用,但是如果只是将一个类复制给一个变量,调用的时候就有可能出现错误
比如:
class Test: List = [] def __init__(self, low, high): for Num in range(low, high): self.List.append(Num ** 2) def __call__(self, Nu): return self.List[Nu] if __name__ == "__main__": b = Test(1, 7) print b.List print b(2)
这样在b(2)的时候回调用__call__
这里可以看下
这里调用b(2)的时候进入的是__call__.
但是如果是这样的代码:
class Test: List = [] def __init__(self, low, high): for Num in range(low, high): self.List.append(Num ** 2) def __call__(self, Nu): return self.List[Nu] if __name__ == "__main__": b = Test b(1,7) print b.List print b(2)
这段代码,先给出结果:
[1, 4, 9, 16, 25, 36]
Traceback (most recent call last):
File "C:\Users\wangchunhui\Desktop\test.py", line 15, in <module>
print b(2)
TypeError: __init__() takes exactly 3 arguments (2 given)
很明显,这里是把一个类赋个了一个变量,但是在b(2)的时候就相当于Test(2),可是在__init__却需要3个参数,这里只有2个,自然报错。
时间: 2024-10-14 11:03:09