Python新手,假设如下
class A:
def __init__(self):
self.X = "A"
#init whatever I need to make this work
def Areturn(self)
return self.x
class B:
def __init__(self):
self.Y = "B"
#initi whatever I need to make this work
def Bset(self. sender)
self.Y = sender因此,现在执行以下操作:
A.x = "QQQ"
B.Bset(A.Areturn)
A.X = "ZZZ"现在我想做的不是为了更新self.Y而调用B.Bset(A.Areturn)。换句话说,我不想每次A发生变化时都显式地“刷新”B。理想情况下,类似于隐式(在B.__init__中定义)标志的内容表示,对于此实例,如果A的值发生更改,则触发B求值。对于每个实例的给定实例,几乎就像A和B之间的“依赖”关系。
关于如何做到这一点的建议?
发布于 2014-08-19 23:41:53
如果您希望要求A在其构造函数中接收B的实例,则可以简单地使用property装饰器来实现:
class A:
def __init__(self, b):
self._x = "A"
self.b = b
@property
def x(self):
return self._x
@x.setter
def x(self, val):
self._x = val
self.b.Y = val
class B:
def __init__(self):
self.Y = "B"如果您想要更通用的东西(这样A就不需要在创建时知道B ),您可以提供一种方法,当A.x更改时,任何对象都可以注册并更新:
class A:
def __init__(self):
self._x = "A"
self._x_listeners = []
@property
def x(self):
return self._x
@x.setter
def x(self, val):
self._x = val
# Update the correct attribute for all listening objects
for listener in self._x_listeners:
setattr(listener[0], listener[1], val)
def register_x_listener(self, obj, prop):
# obj is the object to update, prop is the property on that object.
self._x_listeners.append((obj, prop))
class B:
def __init__(self):
self.Y = "B"
a = A()
b = B()
a.register_x_listener(b, 'Y') # Now b.Y will be updated when a.x changes.
print(a.x)
print(b.Y)
a.x = 5
print(a.x)
print(b.Y)输出:
A
B
5
5https://stackoverflow.com/questions/25387412
复制相似问题