2
我想编写一个类,该子类将Python列表子类化,并在列表更改时通知某个其他对象。因为有许多需要覆盖的方法,我选择的,而不是压倒一切的是改变列表中的所有方法,像这样的解决方案,:替换Python列表对象的特殊方法
destructiveMethods = ["__setitem__",
"__setslice__",
"__delitem__",
"__delslice__",
"append",
"extend",
"remove",
"reverse",
"sort"]
class OwnedList(list):
def __init__(self, owner, initValue=[]):
super(OwnedList, self).__init__(initValue)
def wrappedMethod(method):
def resultMethod(*args, **kwargs):
ret = method(*args, **kwargs)
self.owner.notify()
return ret
return resultMethod
self.owner = owner
for m in destructiveMethods:
setattr(self, m, wrappedMethod(getattr(self, m)))
此工程的方法,如“追加”,而不是特殊的方法,如“__setitem__”。对于那些,我只是得到旧的方法。
我发现,如果我打印的,比方说,附加的价值,我得到的是这样的:
<built-in method append of list object at 0x267a7a0>
但__setitem__(在香草名单)这就是我得到:
<method-wrapper '__setitem__' of list object at 0x266fd40>
也许这与我的问题有关。
任何帮助表示赞赏。如果你知道完成我需要做的更好的方法,请分享你的想法。谢谢。
UPDATE: 别的东西,我已经注意到呼吁__setitem__直接在OwnedList对象上正常工作,但使用括号没有。
谢谢。奇迹般有效。 – Elektito 2011-05-15 13:35:54