每次属性发生更改时,我都使用属性来执行一些代码,如下所示:
class SomeClass(object):
def __init__(self,attr):
self._attr = attr
@property
def attr(self):
return self._attr
@attr.setter
def attr(self,value):
if self._attr != value:
self._on_change()
self._attr = value
def _on_change(self):
print "Do some code here every time attr changes"
这很好用:
>>> a = SomeClass(5)
>>> a.attr = 10
Do some code here every time attr changes
但是如果我存储一个可变对象attr
,attr
可以直接修改,绕过设置器和我的更改检测代码:
class Container(object):
def __init__(self,data):
self.data = data
>>> b = SomeClass(Container(5))
>>> b.attr.data = 10
>>>
让我们假设它attr
只会用于存储类型的对象Container
。每当修改存储在其中的对象时,是否有一种优雅的方式来修改和SomeClass
/或执行?换句话说,我希望我的输出是:Container
SomeClass
_on_change
Container
attr
>>> b = SomeClass(Container(5))
>>> b.attr.data = 10
Do some code here every time attr changes