向python中现有的内置类方法添加装饰器

向python中现有的内置类方法添加装饰器,python,decorator,built-in,Python,Decorator,Built In,我有一个类,它包含许多列表,每当有东西添加到其中一个列表时,我需要触发对实例状态的更改。我在下面创建了一个简单的演示类来演示我要做的事情 假设我有一个这样的类: class MyClass: added = False def _decorator(self, f): def func(item): added = true return f(item) return func

我有一个类,它包含许多列表,每当有东西添加到其中一个列表时,我需要触发对实例状态的更改。我在下面创建了一个简单的演示类来演示我要做的事情

假设我有一个这样的类:

 class MyClass:
     added = False

     def _decorator(self, f):
         def func(item):
             added = true
             return f(item)
         return func

     def __init__(self):
         self.list = [1, 2, 3]
         self.list.append = self._decorator(self.list.append)
class CustomList(list):

  def __init__(self, parent_instance, *args, **kwargs):
    super(CustomList, self).__init__(*args, **kwargs)
    self.parent_instance = parent_instance

  def append(self, item):
      self.parent_instance.added = True
      super(CustomList, self).append(item)


class MyClass(object):
    added = False

    def __init__(self):
        self.list = CustomList(self, [1,2,3])


c = MyClass()
print c.added  # False
c.list.append(4)
print c.added  # True
因为列表是内置的,所以我无法更改它的.append方法

cls = MyClass() #gives me an AttributeError since '.append' is readonly
理想情况下,我可以做到以下几点:

cls = MyClass()
cls.list.append(4)
cls.added #would be true
我该怎么做?子类化
list
是否允许我以这种方式更改它的行为?如果是这样,我如何在不更改方法签名的情况下传递类的状态


谢谢

这适合你的需要吗

class MyClass(object):
    added = False

    def __init__(self):
        self.list = [1,2,3]

    def append(self, obj):
        self.added = True
        self.list.append(obj)



cls = MyClass()
cls.append(4)
cls.added #true
了解您想要实现的具体目标可能会有所帮助。

您需要知道,因此子类化是唯一的方法(实际上是更好、更干净的IMHO)。我喜欢这样的东西:

 class MyClass:
     added = False

     def _decorator(self, f):
         def func(item):
             added = true
             return f(item)
         return func

     def __init__(self):
         self.list = [1, 2, 3]
         self.list.append = self._decorator(self.list.append)
class CustomList(list):

  def __init__(self, parent_instance, *args, **kwargs):
    super(CustomList, self).__init__(*args, **kwargs)
    self.parent_instance = parent_instance

  def append(self, item):
      self.parent_instance.added = True
      super(CustomList, self).append(item)


class MyClass(object):
    added = False

    def __init__(self):
        self.list = CustomList(self, [1,2,3])


c = MyClass()
print c.added  # False
c.list.append(4)
print c.added  # True

我简化了一点。解决方案不起作用的原因是父类(
MyClass
)包含多个子列表。当然,我可以为每一个实现一个“append”,比如
append\u list1
append\u list2
,等等,但这感觉不是特别优雅。谢谢,这应该对我有用!我没有看到的主要内容是如何传入父实例,但您的解决方案显然涵盖了这一点。