对象可调用接口
对象通过__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,而是直接从类中查找。