<p>在原生Python中,没有直接的支持。但是,您可以使用回调来模拟此功能:</p>
<pre><code>from functools import partial
class Teller:
def __init__(self, name):
super().__setattr__('_callbacks', {})
self.name = name
def register(self, attr, callback):
if attr in self._callbacks:
self._callbacks[attr].append(callback)
else:
self._callbacks[attr] = [callback]
def __setattr__(self, attr, value):
if attr in self._callbacks:
for callback in self._callbacks[attr]:
callback(value)
else:
self._callbacks[attr] = []
super().__setattr__(attr, value)
class Asker:
def __init__(self, name):
self.name = name
def bind(self, self_attr, other, other_attr):
other.register(other_attr, partial(setattr, self, self_attr))
setattr(self, self_attr, getattr(other, other_attr))
teller = Teller('Teller')
teller.teller_value = 5
asker = Asker('Asker')
asker.bind('asker_value', teller, 'teller_value')
print(f'teller_value is now {teller.teller_value}')
print(f'asker_value is now {asker.asker_value}')
teller.teller_value = 10
print(f'teller_value is now {teller.teller_value}')
print(f'asker_value is now {asker.asker_value}')
</code></pre>
<p>输出:</p>
^{pr2}$
<p>基本上,这需要<code>Asker</code>的实例将其属性之一绑定到<code>Teller</code>的一个实例;然后,每当<code>Teller</code>实例修改该属性时,<code>Asker</code>实例的相应属性也将更改。在</p>