標籤:
在看源碼的時候看到__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個,自然報錯。
對於Python中的__call__理解