在python中为现有的内置类方法添加一个装饰器

时间:2014-06-24 21:21:20

标签: python decorator built-in

我有一个包含许多列表的类,无论何时将某些内容添加到其中一个列表中,我都需要触发对实例状态的更改。我在下面创建了一个简单的演示课程,试图展示我想要做的事情。

假设我有这样一个类:

 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)

由于内置了一个列表,我无法改变它的.append方法

cls = MyClass() #gives me an AttributeError since '.append' is readonly

理想情况下,我可以执行以下操作:

cls = MyClass()
cls.list.append(4)
cls.added #would be true

我应该怎么做?子类化list是否允许我以这种方式改变它的行为?如果是这样,我如何在不改变方法签名的情况下传入类的状态?

谢谢!

2 个答案:

答案 0 :(得分:2)

cannot monkey-patch builtins,所以子类化是唯一的方法(实际上更好更清洁恕我直言)。我会选择这样的东西:

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

答案 1 :(得分:0)

这会满足您的需求吗?

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

了解您想要达到的目标可能会有所帮助。