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

2024-04-26 18:51:34 发布

您现在位置:Python中文网/ 问答频道 /正文

如果代码被分割成不同的文件,我真的不理解python如何处理全局变量。你知道吗

假设我有3个文件:class1.py,class2.py,主.py你知道吗

在主.py我定义了一个全局变量

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

这个对象包含关于我模拟的系统的信息,由class1.py和class2.py中定义的类使用和操作。你知道吗

当然,有人可能会说,这是一种糟糕的风格,应该避免像这样利用全局变量,但这不是重点。你知道吗

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

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

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

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

  • sys包括系统频率
  • Class1的函数改变系统频率
  • Class2的一个函数模拟了stuff并使用系统频率
  • 在此基础上,系统中的系统功率发生变化
  • Class1函数使用更新的系统电源执行任务

Tags: 文件对象函数frompyimport定义系统
1条回答
网友
1楼 · 发布于 2024-04-26 18:51:34

不,不可能有“C风格的全局变量”,这是设计的。在实例化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()

回答你的第一个问题:

I do not really understand how python handles global variables if the code is split into different files.

Python的“globals”是模块级名称。在运行时,模块是对象(module类型的实例),在模块顶层定义的所有名称都成为模块实例的属性-“defined”是通过赋值、通过defclass语句或通过import语句定义的。你知道吗

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

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

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

你当然想读Ned Batcheler's famous article on Python's names,这通常是理解这一切的一个很好的起点。你知道吗

相关问题 更多 >