【发布时间】:2015-01-17 01:20:21
【问题描述】:
我有加载配置选项的类 Config()。我创建了一个名为 cfg 的类的实例。
然后我有许多 A、B、C 类必须只读来自 cfg 的成员。
from mylib.config import *
from mylib.A import *
from mylib.B import *
from mylib.C import *
cfg = Config(filename)
a = A()
a.do_things()
例如在我的构造函数中:
def __init__(self):
self.name = cfg.name
问题是我在运行时得到 "NameError: name 'cfg' is not defined" 行 self.name = cfg.name
我首先认为这是我在声明 cfg 之前导入 mylib.A、mylib.B 和 mylib.C 的东西 所以我搬家了
cfg = Config(filename)
在导入 mylib.A...B...C 之前。但还是同样的错误。
可能的解决方案:
1. 将对象“cfg”作为参数传递,但我必须更改所有 A、B、C 类中所有方法的签名,我觉得它不干净,因为它在所有方法中乘以相同的参数。
2. 为 A、B、C 类创建私有成员 _cfg。更好但也不是很好,数据成倍增加
3.将类定义+实例声明放在一个文件中,并在mylib.A,mylib.B和mylib.C中导入:AFAISI是最好的解决方案,但仍然不是我的口味,因为我混合了类定义和实例声明,我喜欢在类文件中只有类定义
4.为了避免类定义和实例化在同一个文件中,我可以创建一个'init.py'
from mylib.config import *
cfg = Config(filename)
然后在 mylib.A、mylib.B 和 mylib.C...在 mylib.config.py 类声明文件中导入,mylib.config 在 init.py 中导入),为了避免这种情况,我应该有 init.py 和 init_config.py 。
有没有更好/更清洁/更简单的东西?
【问题讨论】:
标签: class python-3.x methods import global