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