更改不同文件中的全局变量



如果代码被拆分成不同的文件,我真的不明白python如何处理全局变量。

假设我有 3 个文件:class1.py、class2.py main.py

在 main.py 中,我定义了一个全局变量

from class1 import Class1
from class2 import Class2
global sys
sys = constructor()

此对象包含有关我模拟的系统的信息,并由 class1.py 和 class2.py 中定义的类使用和操作。

当然,有人可能会争辩说这是不好的风格,应该避免利用这样的全局变量,但这不是这里的重点。

如果现在我在任一类中使用 sys,则未知。要使用全局变量,当然可以在某处定义它们,然后包含此文件。但是,类所做的更改不会相互影响,所以我不想这样做。

另一种方法是定义一个新的类超类,其中 sys 是成员。如果现在 Class1 和 Class2 是从 SuperClass 继承而来的,我可能会用 super 关键字做一些事情。我真的不想这样做...

长话短说。。。有没有办法定义一个 python 对象,使其行为类似于 C 风格的全局变量?

如果我举个例子,也许会有所帮助:

系统
  • 包括系统频率
  • Class1 的函数改变系统频率
  • Class2 的函数模拟事物并使用系统频率
  • 基于此,系统电源在系统中发生变化
  • Class1 的功能以更新的系统电源执行任务

不,没有办法拥有"C 样式的全局变量",这是设计使然。在实例化 sys 对象时,显式地将 sys 对象传递给 Class1 和 Class2,您将完成一个干净、可读、可测试、可维护的实现:

# lib.py
class Class1(object):
def __init__(self, sys, whatever):
self.sys = sys
# ...
class Class2(object):    
def __init__(self, sys, whateverelse):
self.sys = sys
# ...

# main.py
from lib import Class1, Class2
def main():
sys = constructor()
c1 = Class1(sys, 42)
c2 = Class(sys, "spam")
# now you can work with c1 and c2
if __name__ == "__main__":
main()

回答你的第一个问题:

我真的不明白python如何处理全局变量,如果 代码被拆分为不同的文件。

Python的"全局变量"是模块级名称。在运行时,模块是对象(module类型的实例),在模块顶层定义的所有名称都成为模块实例的属性 - "定义"是通过赋值、defclass语句或import语句。

在模块内部,顶级名称可以通过其所有模块代码中的非限定名称进行访问 - 如果要从函数中重新绑定顶级名称,则只需要global关键字。

从模块外部,您可以使用限定路径访问这些名称,即如果module1定义了名称foo,则可以通过导入module1(使module1成为module2中的顶级名称)并使用通常的属性解析(dotted.name)语法从module2访问它。

您也可以使用from module1 import foo直接导入foo,在这种情况下,将在module2中创建一个新名称foo并绑定到module1.foo(更准确地说:绑定到此时绑定到module1.foo的对象)。这里的要点是,您知道在两个不同的命名空间中有两个不同的名称,因此重新绑定只会影响它反弹的命名空间。

你当然想读Ned Batcheler关于Python名字的著名文章,这通常是理解这一切的一个很好的起点。

相关内容

  • 没有找到相关文章

最新更新