, @Alessandro , , Mutable, . , , , , () . .
, , , . include- Foo , , .
: , Foo Mutable. - , , , : bar.mutable = ('attr0', 5) Mutable attr0. : bar.mutable.attr0 = 5 ( ).
class Mutable(object):
def __init__(self):
self.attr0 = 0
self.attr1 = 1
def __repr__(self):
return str(self.__dict__)[1:-1]
class MonitoredMutable(Mutable):
_get_callback = _set_callback = lambda *_: None
def __init__(self, get_callback, set_callback):
super_delegate = super(MonitoredMutable, self)
super_delegate.__init__()
super_delegate.__setattr__('_get_callback', get_callback)
super_delegate.__setattr__('_set_callback', set_callback)
def __setattr__(self, name, value):
super(MonitoredMutable, self).__setattr__(name, value)
self._set_callback(name, value)
def __getattr__(self, name):
self._get_callback(name)
return super(MonitoredMutable, self).__getattr__(name, value)
def __repr__(self):
public_attrs = {k:v for k,v in self.__dict__.items()
if not k.startswith('_')}
base_classname = self.__class__.__bases__[0].__name__
return base_classname + ': ' + (str(public_attrs)[1:-1] if public_attrs
else 'No pub attributes')
class Foo(object):
def __init__(self):
self._mutable = MonitoredMutable(self._get_callback, self._set_callback)
def _get_callback(self, name):
print('mutable.' + name + ' was read')
def _set_callback(self, name, value):
print('mutable.' + name, 'was set to', value)
@property
def mutable(self):
return self._mutable
@mutable.setter
def mutable(self, attr_value_pair):
attribute, value = attr_value_pair
setattr(self._mutable, attribute, value)
bar = Foo()
print(bar.mutable)
bar.mutable = ('attr0', 5)
bar.mutable = ('attr1', 10)
print(bar.mutable)
bar.mutable.attr0 = 1
bar.mutable.attr1 = 0
print(bar.mutable)