我知道在Python中变量指向对象,因此当你将一个变量分配给另一个对象时,它们都指向同一个对象。我想做的是当另一个变量发生变化时使一个变量发生变化。在这种情况下,我正在开发 GUI。所以我有一个带有文本属性的标签。我希望该属性等于另一个类中的属性。目前我正在通过使用中间函数来做到这一点,但感觉应该有一种更优雅的方式来做到这一点。所以我的方式实际上类似于以下内容:
class Label():
def init():
self.text = None
self.gettext = None
def display():
if callable(self.gettext):
self.text = self.gettext()
else:
self.text = self.gettext
print(str(self.text))
class Anotherclass():
def init():
self.anattribute = "avaluethatchanges"
mylabel = Label()
myclass = Anotherclass()
def gettheattribute():
return myclass.anattribute
mylabel.gettext = gettheattribute
会有很多标签链接到很多不同的类。所以我想做的就是:
mylabel.gettext = myclass.anattribute
但是,当 myclass.anattribute 更改时 - myclass.gettext 却没有更改。我明白为什么,但是有另一种编写方式可以做到这一点 - 无需创建函数吗?
非常感谢
编辑:-这两个类都将在其他应用程序中使用,其中一个或另一个可能不存在,因此我无法在类本身内对它们之间的关系进行硬编码。
最佳答案
我要说的第一件事是,在两个地方重复存储数据有点反模式,因为它违反了 DRY 软件开发原理。
一般来说,像这样的GUI设计,都会有MVC的概念,或者模型、 View 、 Controller >。
这是一个相当大的主题,但总体思路是创建一个模型对象来存储所有数据,然后创建 GUI 的所有其他部分 - 显示数据的许多 View 以及更改的 Controller 数据——全部看模型,这样数据只在一处存储和更新。
GUI 元素要么被设计为接受模型,要么手动触发刷新,要么有某种类型的监听/回调/事件系统在模型更改时自动触发 View 上的刷新。具体处理方式取决于您使用的 GUI 框架。
实现此目的的一个简单方法是创建一个模型类,两个类共享并使用 python 属性和回调注册表来触发更新。
class Model():
def __init__(self, text):
self._text = text
self._callbacks = []
def on_text_changed(callback):
self._callbacks.append(callback)
@property
def text(self):
return self._text
@text.setter
def text(self, value):
self._text = text
for callback in self._callbacks:
callback()
那么其他两个类都需要这样的东西
class Label():
def __init__(self, model):
self.model = model
self.model.on_text_changed(self.refresh)
def refresh(self):
print(self.text)
@property
def text(self):
return self.model.text
@text.setter
def text(self, value):
self.model.text = value
然后你会像这样创建它们
model = Model('The text')
label = Label(model)
another_class = AnotherClass(model)
label.text = 'This will update text on all classes'
another_class.text = 'So will this'
model.text = "And so will this.
关于python - 在 Python 中将两个变量绑定(bind)在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49781422/