跨模块访问全局变量和Python中的staticmethods

时间:2017-02-01 11:07:13

标签: python python-2.7 module global-variables static-methods

假设有两个标题为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访问static方法,并且应该返回一个连接的字符串。

# 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

1 个答案:

答案 0 :(得分:1)

在您的特定情况下,您不必使用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 docs几乎没有关于跨模块共享全局变量的部分:https://docs.python.org/3/faq/programming.html?highlight=global#how-do-i-share-global-variables-across-modules