在Python中,函數其實是一個對象:
>>> f = abs >>> f.__name__ 'abs' >>> f(-123) 123
由於 f 可以被調用,所以,f 被稱為可調用對象。
所有的函數都是可調用對象。
一個類實例也可以變成一個可調用對象,只需要實現一個特殊方法__call__()。
我們把 Person 類變成一個可調用對象:
class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender def __call__(self, friend): print 'My name is %s...' % self.name print 'My friend is %s...' % friend
單看 p('Tim') 你無法確定 p 是一個函數還是一個類實例,所以,在Python中,函數也是對象,對象和函數的區別並不顯著。
再比如:
class A(object): def __init__(self,name,age): self.name=name self.age=age f=A('hello',18) print(f()) #TypeError: 'A' object is not callable
打印f()會報錯object is not callable,f不是可調用對象
如果在類中加上__call__方法
class A(object): def __init__(self,name,age): self.name=name self.age=age def __call__(self, *args, **kwargs): return self.name,self.age f=A('hello',18) print(f()) #('hello', 18)
此時,f就是可調用對象