任何類,只須要定義一個__call__()方法,就可直接對實例進行調用
對實例進行直接調用就比如對一個函數進行調用同樣函數
__call__()還可定義參數,因此調用徹底能夠把對象當作函數,把函數當作對象,由於這二者之間原本就沒啥根本的區別
若是把對象當作函數,那麼函數自己其實也能夠在運行期動態建立出來,由於類的實例都是運行期建立出來的,所以也就模糊了對象和函數的界限
判斷變量是對象仍是函數
更多的時候,需判斷對象是否能被調用,若是對象能被調用,則該對象就是一個Callable對象
好比函數和上面定義的帶有__call__()的類實例,它們就是就是能被調用的,它們都是一個Callable對象
spa
class Student(object): def __init__(self, name): self.name = name def __call__(self): print('My name is %s.' % self.name) s = Student('Michael') s() #輸出:My name is Michael. #經過callable()函數,能夠判斷一個對象是不是"可調用"對象 callable(Student()) #True callable(max) #True callable([1, 2, 3]) #False callable(None) #False callable('str') #False