关于python:如何避免全局变量

How to avoid global variables

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

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

建造以下设计真的有什么问题吗?

  • menu.py——>文件将从此处加载
  • main.py-->此处可以使用加载的文件对象
  • dialog1.py-->或此处
  • dialog2.py->或那里
  • dialog3.py->或那里
  • 环球公司

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

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

非常感谢你的帮助


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

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

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


我将通过将数据封装在一个或多个类中来管理全局数据,并为这些类实现BORG模式。看看为什么在python中borg模式比singleton模式更好