2011-05-15 68 views
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对象上正常工作,但使用括号没有。

回答

2

特殊方法只能定义对象的类型而不能定义实例source

比较

>>> class A(object): 
...  __getitem__ = lambda self,i: 42 
>>> A()[0] 
42 

>>> class B(object): 
...  def __init__(self): 
...    self.__getitem__ = lambda self,i: 42 
>>> B()[0] 
TypeError: 'B' object does not support indexing 

你应该适应A,即直接在类体内定义你的特殊的方法,而不是在构造函数中。

+0

谢谢。奇迹般有效。 – Elektito 2011-05-15 13:35:54