如果代码被分割成不同的文件,我真的不理解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风格的全局变量?你知道吗
如果我举个例子也许会有帮助:
不,不可能有“C风格的全局变量”,这是设计的。在实例化sys对象时,将其显式地传递给Class1和Class2,这样就可以使用干净、可读、可测试、可维护的实现完成:
回答你的第一个问题:
Python的“globals”是模块级名称。在运行时,模块是对象(
module
类型的实例),在模块顶层定义的所有名称都成为模块实例的属性-“defined”是通过赋值、通过def
或class
语句或通过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,这通常是理解这一切的一个很好的起点。你知道吗
相关问题 更多 >
编程相关推荐