問題引出
一般情況下類方法的調用是通過先創建類對象再通過a.b()的方式來調用,但是如果類中只有一個方法或者一個方法的使用頻率非常高,那么就可以為這個方法命名為__call__來簡化調用。
__call__
存在__call__方法的類對象被稱為可調用對象,它的作用可以總結為以下兩點:
- 簡化了對象下方法的調用 (當某方法調用頻率很高)
- 模糊了對象和函數調用時的區別 (提高了代碼的兼容性)
示例1
創建一個類A,類A中有m、n兩個函數,m的使用頻率非常高,於是我們就可以用__call__來簡化m的調用:
# 使用__call__前 class A(): def m(self): print('a') def n(self): print('b') a = A() a.m()
# 使用__call__后 class A(): def __call__(self): print('a') def n(self): print('b') a = A() a()
示例2
創建類A和函數B,類A下的m函數與函數B功能類似;現在我們需要將A的對象和B函數作為參數傳到函數C中去執行:
# 使用__call__前 class A(): def m(self): print('good') a = A() def B(): print('good') def C1(func): func.m() def C2(func): func() C1(a) C2(B)
由於對象和函數調用上的區別我們必須要有兩個不同的C函數才能實現相同的功能,而通過__call__我們就可以模糊兩者的差別,提高程序的兼容性:
# 使用__call__后 class A(): def __call__(self): print('good') a = A() def B(): print('good') def C(func): func() C(a) C(B)