對於Python中的__call__理解

在看源碼的時候看到__call__不是很明白原理,因此在這裏記錄下
python

一般來講__call__的調用時實例後面的"()"引發的他自身的調用,可是若是隻是將一個類複製給一個變量,調用的時候就有可能出現錯誤
app

好比:ui

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__code

這裏能夠看下源碼

這裏調用b(2)的時候進入的是__call__.it

可是若是是這樣的代碼:ast

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)

這段代碼,先給出結果:class

[1, 4, 9, 16, 25, 36]test


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個,天然報錯。

相關文章
相關標籤/搜索