【发布时间】:2013-11-21 02:19:43
【问题描述】:
每当属性发生变化时,我都会使用属性来执行一些代码,如下所示:
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 在Container 中存储的Container 对象被修改时执行_on_change?换句话说,我希望我的输出是:
>>> b = SomeClass(Container(5))
>>> b.attr.data = 10
Do some code here every time attr changes
【问题讨论】:
-
你不能在你的
@attr.setter方法中这样做吗? -
@martineau -- 不,这里没有设置
attr。attr.data是正在设置的内容。 -
顺便说一下,enthought Traits 直接支持这种 notify-on-change 行为,包括在子对象被修改时通知父对象。这对这个应用程序来说是多余的,但如果你经常使用这样的复杂通知模式,它可能会很有用。
标签: python