python hook函数_python2中的类方法hook decorator

多亏了@martijn pieters,我像这样重写了它(在python2.7中工作得很好):def _add_hook_for(cls, target):

def hook_decorator(hook):

def hooked(s, *p, **k):

ret = target(s, *p, **k)

# some magic happens here

print(hook(s, target.__name__, *p, **k))

return ret

setattr(cls, target.__name__, hooked)

return hook

return hook_decorator

def reporting_list_deco(cls):

@_add_hook_for(cls, cls.append)

@_add_hook_for(cls, cls.extend)

@_add_hook_for(cls, cls.sort)

@_add_hook_for(cls, cls.reverse)

def no_idx_info(s, op, *p, **k):

return '%s %s' % (op, s._name)

@_add_hook_for(cls, cls.__setitem__)

@_add_hook_for(cls, cls.insert)

@_add_hook_for(cls, cls.__delitem__)

@_add_hook_for(cls, cls.remove)

@_add_hook_for(cls, cls.pop)

def idx_info(s, op, idx='', *p, **k):

return '%s %s[%s]' % (op, s._name, idx)

return cls

def test_reporting_list():

@reporting_list_deco

class reporting_list(list):

def __init__(self, name, *p, **k):

super(reporting_list, self).__init__(*p, **k)

self._name = name

rl = reporting_list('foo', [61,62,63])

rl[1] = 1

rl.append(7)

rl.remove(1)

rl.extend([5,6,7])

rl.pop()

rl.pop(2)

rl.sort()

del rl[0]

rl.reverse()

print(rl)

输出:

^{pr2}$

它也可以应用于口述。谢谢你马蒂金!在

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值