Python 對象特殊方法:(二)對象可調用接口

對象可調用接口

對象通過__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,而是直接從類中查找。

發佈了46 篇原創文章 · 獲贊 10 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章