如何避免全局变量

时间:2013-04-15 08:45:31

标签: python global-variables

在阅读python文档和各种邮件列表时,我总是阅读看起来有点像教条的内容。全局变量应该像地狱一样避免,它们设计很差......好吧,为什么不呢?但是有一些真实的生活情况,我不知道如何避免这种模式。

假设我有一个GUI,可以从主菜单中加载多个文件。 对应于加载的文件的文件对象可以通过所有GUI使用(例如,将显示图像的图像查看器,并且可以通过不同的对话框/插件在其上执行各种动作)。

构建以下设计是否有问题:

  • Menu.py - >该文件将从这里加载
  • Main.py - >加载的文件对象可以在这里使用
  • Dialog1.py - >或者在这里
  • Dialog2.py - >或者那里
  • Dialog3.py - >或者那里
  • ...
  • Globals.py

其中Globals.py将存储一个字典,其字符是已加载文件的名称和相应文件对象的值。然后,从那里,需要这些数据的代码的各个部分将通过弱引用访问它。

很抱歉,如果我的问题看起来(或者是)很愚蠢,但你看到任何优雅或全球免费的替代品吗?一种方法是将加载的数据字典封装在Main.py的主应用程序类中,将其视为GUI的中央访问部分。然而,这也会带来一些复杂性,因为这个类应该可以从需要数据的所有对话框中轻松访问,即使它们是必要的直接子代。

非常感谢你的帮助

2 个答案:

答案 0 :(得分:10)

应避免使用全局变量,因为它们会阻止代码重用。多个小部件/应用程序可以很好地存在于同一个主循环中。这允许您将您现在认为的单个GUI抽象到一个库中,该库根据请求创建这样的GUI,以便(例如)单个启动器可以启动共享相同过程的多个顶级GUI。

如果使用全局变量,这是不可能的,因为多个GUI实例将胜过彼此的状态。

全局变量的替代方法是将所需属性与顶级窗口小部件相关联,并创建指向相同顶级窗口小部件的子窗口小部件。然后,例如,菜单操作将使用其顶级窗口小部件来访问当前打开的文件,以便对其进行操作。

答案 1 :(得分:-2)

我会通过将数据封装在一个或多个类中来管理全局数据,并为这些类实现borg模式。 见Why is the Borg pattern better than the Singleton pattern in Python

相关问题