Я использую свойства для выполнения некоторого кода каждый раз, когда происходит изменение атрибута, например:
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
может быть изменен напрямую, минуя setter и мой код обнаружения изменений:
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