原標題:Python魔法方法之 __call__

前言

Python的魔法方法是指Python內部已經包含的,被雙下劃線所包圍的方法,這些方法在特定的操作時會自動被調用。魔法方法可以使Python的自由度變得更高,當不重載魔法方法時它可以在規定的默認情況下生效,也可以根據自己的需求來重載分魔法方法來達到自己的目的。

__call__( )

__call__(self,[*args])允許一個類實例對象能像函數那樣被調用。在介紹 __call__之前,我們來先來介紹一個概念,可調用對象:在Python中,凡是可以將直接應用到自身並執行,都可以稱為 可調用對象,它包括 自定義函數,內置函數,類。判斷一個對象是否是可調用對象,我們可以用Python內置的函數 callable( ),如我們定義了類 str_cls,我們可以用它來判斷是否是個可調用對象:

>>> class str_cls:... pass...>>> callable(str_cls)True# 對實例對象 a 做判斷>>> a = str_cls>>> callable(a)False

可以看到,類是可調用對象,實例對象不是可調用對象,而一旦在類內部實現了 __call__方法,那麼該類創建的實例對象也將稱為一個可調用對象,看下面示例:

>>> class Animal:... def __init__(self,name,age):... self.name = name... self.age = age... def __call__(self,food):... print("my name is %s,i'm %d old" %(self.name,self.age))... print('i eat %s' % food)...>>> dog = Animal('dog',12)>>> callable(Animal)True>>> callable(dog)True>>> dog('milk')my name is dog,i'm 12 oldi eat milk

可以看到,我們在類Animal中實現了 __call__方法,實例對象 dog也是可調用對象,並且 dog('milk')實際上是調用了 __call__(self,food)方法.

如果沒有實現 __call__方法,那麼去調用 dog('milk'),會拋出異常提示Animal實例對象是不可調用的: TypeError: 'Animal' object is not callable