__call__是Python 類中一個非常特殊的實例方法,使得類實例對象可以像調用普通函數那樣,以 "對象名()" 的形式進行使用。 Python中那些能夠在後面加()來調用執行的對象,被稱為可調用對象。如果類中定義了__call__()方法,那麼該類的實例對象也將成為可調用對象。該對象被調用時,將執行__call__()方法中的代碼。
class Entity:
def __init__(self, x, y):
self.x = x
self.y = y
print("初始化x:{0},y:{1}".format(x, y))
def __call__(self, x, y):
self.x, self.y = x, y
print("修改後x:{0},y:{1}".format(x, y))
e = Entity(1, 2) # 創建實例
e(4, 5) # 實例可以像函數那樣執行,並傳入x y值,修改對象的x y
執行上述代碼,其輸出結果為:
初始化x:1,y:2
修改後x:4,y:5
實例對象也可以像函數一樣作為可調用對象來用,那麼,這個特點在什麼場景用得上呢?
這個要結合類的特性來說,類可以記錄數據(屬性),利用這種特性可以實現基於類的裝飾器,在類裡面記錄狀態,比如下面這個例子中用於記錄函數被調用的次數: