在模块之间共享变量



我有这样的情况:

library_file1.py:

class A:
    def foo(self):
        print("bar")
    def baz(self):
        pass

project_file.py:

from library_file1 import A
class B(A):
    def baz(self):
        print(the_variable)

library_file2.py:

from project_file import B
the_variable = 7
b = B()
b.foo()   # prints "bar"
b.baz()   # I want this to print "7", but I don't know how

我如何允许代码在project_file.py中编写,可以从library_file2.py访问变量?我能想到的唯一解决办法是:

project_file.py:

from library_file1 import A
class B(A):
    def baz(self, the_variable):
        print(the_variable)

library_file2.py:

from project_file import B
the_variable = 7
b = B()
b.foo()
b.baz(the_variable)

,但这感觉很尴尬,不能扩展到许多变量,如the_variable

很容易:你需要变量是在project_file.py而不是library_file2.py。修改project_file为:

from library_file1 import A
the_variable = None
class B(A):
    def baz(self):
        print(the_variable)

然后在library_file2:

import project_file
from project_file import B
project_file.the_variable = 7
b = B()
b.foo()   # prints "bar"
b.baz()   # prints "7"

使用参数也是一个很好的解决方案(你应该尽可能避免全局变量)。


在python中没有真正的全局变量。变量总是附加到作用域。当一个变量在模块作用域中时,我们通常说它是"全局的"。

最宽的作用域是内置作用域,所以理论上可以添加一些东西作为内置作用域。然而,这是一个真正的坏习惯。而且它并没有完全解决这个问题,因为所有的文件都可以访问这个新的内置,但是他们不能在没有明确提及作用域的情况下重新分配它。

最新更新