多亏了@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}$
它也可以应用于口述。谢谢你马蒂金!在