如何避免全局变量

Eur*_*ice 11 python global-variables

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

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

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

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

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

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

非常感谢你的帮助

use*_*342 12

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

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

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