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