python中一切皆對象,函數也是對象,同時也是可調用對象(callable)。
關於可調用對象,我們平時自定義的函數、內置函數和類都屬於可調用對象,但凡是可以把一對括號()應用到某個對象身上都可稱之為可調用對象,判斷對象是否為可調用對象可以用函數 callable
# 1、一個類實例要變成一個可調用對象,只需要實現一個特殊方法__call__()。
class Animal:
def __init__(self, name, hobby):
self.name = name
self.hobby = hobby
def __call__(self, food):
print('animal name is %s...' % self.name)
print('animal name like eat %s...' % food)
if __name__ == '__main__':
animal = Animal('cat', 'play')
# animal.__call__('fish')
animal('fish')
print(callable(animal))
實質上說,這意味着 animal() 與 animal.__call__() 是相同的。注意 __call__ 參數可變。這意味着你可以定義 __call__ 為其他你想要的函數,無論有多少個參數
# 2、 __call__ 在那些類的實例經常改變狀態的時候會非常有效
class TEST: def __init__(self, size, x, y): self.x, self.y = x, y self.size = size def __call__(self, x, y): """ 改變實體的位置 :param x: :param y: :return: """ self.x, self.y = x, y print(self.x, self.y) def test_num(self): print(self.x) if __name__ == '__main__': test = TEST(1, 2, 3) # 創建實例
test(4, 5) # 實例可以象函數那樣執行,並傳入x y值,修改對象的x y
test.test_num() """ 結果: 4 5 4 """
# 3、參考大神鏈接
https://www.jianshu.com/p/e1d95c4e1697?utm_source=oschina-app