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,而是直接从类中查找。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值