在Python中跨模块和静态方法访问全局变量



假设两个名为GlobVarsMyModule的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包含一个具有两个函数(_concatgetConcat)的类,其中一个函数(即_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-全局变量-交叉模块

最新更新