为Python中的内置类方法添加装饰器

1 投票
2 回答
916 浏览
提问于 2025-04-18 10:56

我有一个类,这个类里面有好几个列表。每当往这些列表里添加东西的时候,我需要让这个类的状态发生变化。为了说明我想做的事情,我下面创建了一个简单的示例类。

假设我有一个这样的类:

 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

这样做能满足你的需求吗?

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

知道你具体想要实现什么可能会很有帮助。

2

你不能对内置的功能进行“猴子补丁”,所以最好的办法就是通过继承来实现(我觉得这样更好也更干净)。我会选择类似下面的方式:

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

撰写回答