gpt4 book ai didi

python - 将全局变量传递给类和函数的替代方法

转载 作者:太空宇宙 更新时间:2023-11-03 23:48:46 24 4
gpt4 key购买 nike

我是 python 的新手,我一直在读到使用 global 将变量传递给其他函数被认为是菜鸟,也是一种不好的做法。我想不再使用全局变量,但我不确定该怎么做。

现在我有一个在 wxPython 中创建的 UI 作为它自己的独立类,我还有另一个类从 .ini 文件加载设置。由于 UI 中的设置应与 .ini 中的设置相匹配,我该如何传递这些值?我可以使用类似的东西:Settings = Settings() 然后将变量定义为类似 self.settings1 的东西,但是我必须做 Settings 一个全局变量,用于将其传递给我的 UI 类(如果我在其中分配 main() 则不会)。

那么传递这些变量的正确和 pythonic 方法是什么?

编辑:这是我正在使用的代码,我正在努力让它像 Alex Martelli 的示例一样工作。以下代码保存在Settings.py中:

import ConfigParser

class _Settings():
@property
def enableautodownload(self): return self._enableautodownload
def __init__(self):
self.config = ConfigParser.ConfigParser()

self.config.readfp(open('settings.ini'))
self._enableautodownload=self.config.getboolean('DLSettings', 'enableautodownload')

settings = _Settings()

每当我尝试从另一个文件引用 Settings.settings.enableautodownload 时,我都会得到:AttributeError: 'module' object has no attribute 'settings'。我做错了什么?

编辑 2:别在意这个问题,我重新输入了代码,它现在可以工作了,所以它一定是一个简单的拼写或语法错误。

最佳答案

global 变量的替代方案有很多——主要是:

  • 函数的显式参数、为创建其实例之一而调用的类等(这通常是最清晰的,因为它使依赖关系最明确,在可行且不太重复的情况下);
  • 对象的实例变量,当需要访问这些值的函数是同一对象上的方法时(这也可以,并且是使用 OOP 的合理方式);
  • 提供值的“访问函数”(或具有值的属性或属性的对象)。

这些中的每一个(尤其是第一个和第三个)对于名称必须被所有和杂项重新绑定(bind)但只能访问的值特别有用。 global 的真正大问题是它提供了一个“隐蔽的通信 channel ”(不是密码意义上的,而是字面上的:表面上独立的功能实际上可以相互依赖,相互影响,通过函数签名中不“明显”的全局值——这使得代码难以测试、调试、维护和理解)。

对于您的特定问题,如果您从不使用 global 语句,而是从任何地方以“只读”方式访问设置(并且您可以通过使所述对象的attributes 是只读属性!),然后对单个“只读”访问执行一次,然后不更改,模块级实例,这并不是太糟糕。即,在某些模块 foo.py 中:

class _Settings(object):
@property
def one(self): return self._one
@property
def two(self): return self._two
def __init__(self, one, two):
self._one, self._two = one, two
settings = _Settings(23, 45)

从其他任何地方,导入 foo 然后根据需要访问 foo.settings.onefoo.settings.two。请注意,我用一个前导下划线命名该类(就像只读属性下面的两个实例属性一样)表明它不打算从模块“外部”使用——只有 settings 对象应该是(没有强制执行——但任何违反此类请求隐私的用户显然是唯一对可能发生的困惑负责的一方;-)。

关于python - 将全局变量传递给类和函数的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3640700/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com