实现这一目标的“最佳实践”方法是什么?
test.py
import testmodule
class MyClassA():
def __init__(self, id):
self.id = id
if __name__ == '__main__':
global classa_dict
classa_dict = {}
classa_dict[1] = MyClassA(1)
classa_dict[2] = MyClassA(2)
testing = testmodule.TestModule()
testmodule.py
class TestModule():
def __init__(self):
global classa_dict
print classa_dict[2]
输出
$ python test.py
Traceback (most recent call last):
File "test.py", line 13, in <module>
testing = testmodule.TestModule()
File "/path/to/project/testmodule.py", line 4, in __init__
print classa_dict[2]
NameError: global name 'classa_dict' is not defined
答案 0 :(得分:4)
最佳做法是不要这样做。
global
关键字实际上是错误名称 - 它只是指模块范围,而不是本地。没有办法让每个范围内的变量自动生成。而是在一个模块中的模块级别定义它,并将其导入到您需要的任何位置。
答案 1 :(得分:2)
事实上,你可以像你想要的那样取得成就:
testmodule.py:
classa_dict={}
class Test():
def __init__(self):
global classa_dict
print classa_dict[2]
test.py:
import testmodule
class MyClassA():
def __init__(self, id):
self.id = id
if __name__ == '__main__':
lclassa_dict = testmodule.classa_dict
lclassa_dict[1] = MyClassA(1)
lclassa_dict[2] = MyClassA(2)
testing = testmodule.Test()
请注意,除了您的想法之外,全局使用其他方式。如果您编写global varname
,这意味着Python不应生成本地变量varname
,而是在全局范围内查找名为varname
的变量。也就是说,类Test
不会生成局部变量classa_dict
,但它会使用全局变量classa_dict
。
因此,global
在声明时无需告诉python该变量可以在任何地方使用。它更多地告诉Python已经有一个带有这个名字的变量,可以参考。
这意味着,在testmodule.ty
中,行global classa_dict
表示:查看模块中的某个位置以查找变量classa_dict
并对此变量进行操作,而不是创建新的 local < / em>变量classa_dict
。
在test.py
中,您可以指定classa_dict = testmodule.classa_dict
告诉python lclassa_dict
引用classa_dict
中的testmodule.py
。因此,global
中不需要test.py
,因为您只需在testmodule.classa_dict
分配内容时修改lclassa_dict
。然后,Test
中的班级testmodule.py
知道它应该向testmodule.classa_dict
查看,因为它使用global
。