假设两个名为GlobVars
和MyModule
的Python模块。
模块GlobVars
旨在为另一个模块提供全局变量my_glob_var
。
# cat GlobVars.py
class getGlobVars:
def __init__(self):
global my_glob_var
my_glob_var = 'World'
def go(self):
pass
模块MyModule
包含一个具有两个函数(_concat
和getConcat
)的类,其中一个函数(即_concat
)是尝试访问上述全局变量的静态方法。函数getConcat
访问静态方法,并应该返回一个连接字符串。
# cat MyModule.py
import GlobVars as GV
class MyClass:
def __init__(self, var1):
self.var1 = var1
@staticmethod
def _concat(var2):
GV.getGlobVars().go()
return var2 + my_glob_var
def getConcat(self):
return MyClass._concat('Hello ')+self.var1
当我尝试加载两个模块并执行函数getConcat
时,全局变量似乎无法正确访问。为什么会这样,解决方案是什么?
import MyModule
import GlobVars
print MyModule.MyClass('!').getConcat()
# NameError: global name 'my_glob_var' is not defined
在您的特定情况下,您不必使用global
关键字或GlobVars
类。
相反:
# cat GlobVars.py
my_glob_var = 'World'
# cat MyModule.py
import GlobVars as GV
class MyClass:
def __init__(self, var1):
self.var1 = var1
@staticmethod
def _concat(var2):
return var2 + GV.my_glob_var
def getConcat(self):
return MyClass._concat('Hello ')+self.var1
顺便说一句,python文档中很少有关于跨模块共享全局变量的部分:https://docs.python.org/3/faq/programming.html?highlight=global#how-do-i-shea-全局变量-交叉模块