python - 在 Python 中将两个变量绑定(bind)在一起

标签 python

我知道在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/

相关文章:

python - Mac OS X 中的 virtualenv 问题

python - 如何修复此 JSON TypeError : string indices must be integers?

python - cherrypy 捕获所有路线

java - 怎么可能对字符串进行两次编码?

python - 如何将数据框转换为以行和列作为 Pandas 键的字典?

python - tweepy:找到转推的原作者

python - 应用引擎 : Step-by-Step Debugging

Python 脚本错误

python - 过滤 xml 文件以删除其中包含特定文本的行?

python - 如何将 python 变量编码为 URL 和网络服务器响应?