次のように、属性が変更されるたびにプロパティを使用してコードを実行しています。
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
が type のオブジェクトを格納するためにのみ使用されると仮定しましょうContainer
。格納されているオブジェクトが変更されるたびに、変更SomeClass
および/または実行Container
するエレガントな方法はありますか? つまり、出力を次のようにします。SomeClass
_on_change
Container
attr
>>> b = SomeClass(Container(5))
>>> b.attr.data = 10
Do some code here every time attr changes