我是 python 新手,我一直在使用global
将变量传递给其他函数被认为是新手,也是一种不好的做法。我想不再使用全局变量,但我不知道该怎么做。
现在,我有一个在 wxPython 中创建的 UI 作为其自己的单独类,并且我有另一个从 .ini 文件加载设置的类。由于 UI 中的设置应与 .ini 中的设置相匹配,因此如何传递这些值?我可以使用类似的东西:Settings = Settings()
然后将变量定义为类似的东西self.settings1
,但是我必须做Settings
一个全局变量,将其传递给我的 UI 类(如果我在其中分配,则不会是这样)main()
).
那么传递这些变量的正确且Python式的方法是什么?
Edit:这是我正在使用的代码,我正在尝试让它像 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'
。我究竟做错了什么?
Edit 2:别介意这个问题,我重新输入了代码,现在它可以工作了,所以它一定是一个简单的拼写或语法错误。
的替代方案global
变量有很多——主要是:
- 函数的显式参数、调用来创建其实例之一的类等(这通常是最清晰的,因为它使依赖关系最显式,在可行且不太重复的情况下);
- 对象的实例变量,当需要访问这些值的函数是同一对象上的方法时(这也可以,并且是使用 OOP 的合理方法);
- 提供值的“访问器函数”(或具有值的属性或属性的对象)。
其中每一个(尤其是第一个和第三个)对于其名称必须的值特别有用not可以被所有人重新绑定,但只能访问。真正的大问题是global
是它提供了一个“隐蔽的通信通道”(不是密码学意义上的,而是字面意义上的:表面上独立的函数实际上可以通过函数中不“明显”的全局值相互依赖、相互影响' 签名——这使得代码难以测试、调试、维护和理解)。
对于您的具体问题,如果您从不使用global
语句,而是从任何地方以“只读”方式访问设置(并且您可以通过使所述对象的属性成为只读属性来更充分地确保这一点!),然后执行“只读”访问一个单一的、一次制作就不再更改的模块级实例还不错。即,在某些模块中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)
以及来自其他地方的,import foo
然后只需访问foo.settings.one
and foo.settings.two
如所须。请注意,我用一个前导下划线命名该类(就像只读属性下面的两个实例属性一样),以表明它不应该从模块“外部”使用——只能在settings
对象应该是(没有强制执行——但任何侵犯此类请求隐私的用户显然是唯一对可能发生的混乱负责的一方;-)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)