Python如何在包之间的调用中解析全局变量,尤其是在存在具有相同名称的全局变量的情况下?
例如。让ba包P1
包含BaseClass
。假设有两个包P2
和P3
,其中包含相应继承Derived1
的类Derived2
和BaseClass
。另外,让P2
和P3
都包含名为gvar
的变量(例如,在 init .py文件中定义)。
其构造函数中的两个派生类都通过baseClass
调用super
构造函数。
如果在BaseClass
构造函数中有gvar
的引用,会发生什么?有没有办法确保在Derived1
gvar
P2
的实例化期间使用?
为什么我要烦扰全局变量:在我的现实生活中,P1
和P2
中有几十个类,我想避免全部更改(添加特定于包的{ {1}}他们的定义,或添加另一个共同的祖先)。
答案 0 :(得分:1)
Globals 每个模块。 P1
,P2
和P3
中的全局都是独立的。
Python函数还存储一个指向其模块的全局变量映射的指针,因此即使在导入时,仍会在定义的模块中查找全局变量。
对于您的示例,这意味着在P2.Derived1.__init__
中查找了从P2
引用的全局,并在P3.Derived2.__init__
中查找了从P3
引用的全局。这两个软件包都需要导入 P1.BaseClass
,并且可能查找的任何全局字符P1.BaseClass.__init__
都来自P1
。
答案 1 :(得分:0)
"全球"变量仅对定义它们的模块(即文件)是全局的。如果给定文件中有函数(包括方法),并且该函数引用全局变量gvar
,则它将始终引用该模块中的全局变量gvar
,而不是任何其他模块。
但是,您可以从模块外部修改或创建全局变量。例如,如果您执行import blah
然后blah.gvar = 2
,则您已在gvar
内有效创建了一个全局变量blah
(或更改了其值,如果它已经存在),并且引用blah
的{{1}}内的代码将使用您设置的值。