對象可調用接口
對象通過__call__(self [, *args [, **kwargs]])方法模擬函數行爲
如果一個對象提供了__call__()方法即可被調用。下面給幾個例子:
例1,
class DistanceFrom(object):
def __init__(self, origin):
self.origin = origin
def __call__(self, x):
return abs(x - self.origin)
nums = [1, 32, 23, 210, 213, 45]
nums.sort(key=DistanceFrom(10))
這是《參考手冊》裏的例子,對象DistanceFrom(10)是可調用的單參方法,做爲sort的key函數。
例2,
class T(object):
pass
t = T()
T.__call__ = lambda self: "call in T"
t() # "call in T"
這個稍微有點意思,T中__call__是非綁定方法,所以有self參數(當然self只是規範,換做this, obj, anything都可以)。可以再上面基礎上再做修改
t.__call__ = lambda : "call in t"
t() # "call in T"
t.__call__是綁定方法,所有不需要有self參數。執行t()返回“call in T”,沒沒有得到後定義的 “call in t”,這是因爲t.__call__保存的t.__dict__中,而特殊方法的調用不會從對象的dict,而是直接從類中查找。