向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
,等等,但这感觉不是特别优雅。谢谢,这应该对我有用!我没有看到的主要内容是如何传入父实例,但您的解决方案显然涵盖了这一点。