包之间的Python全局变量解析是如何工作的



Python如何在包之间的调用中解析全局变量,尤其是在存在同名全局变量的情况下?

例如。设存在包含BaseClass的包P1。设有两个包P2P3,包含相应继承BaseClass的类Derived1Derived2。此外,让P2P3都包含名为gvar的变量(例如,在它们的init.py文件中定义)。

构造函数中的两个派生类都通过super调用baseClass构造函数。

如果在BaseClass构造函数中有对gvar的引用,会发生什么?有没有办法确保在Derived1的实例化过程中使用来自P2gvar

为什么我要处理全局变量:在我的现实生活中,P1P2中有几十个类,我希望避免全部更改它们(将特定于包的gvar添加到它们的定义中,或者添加另一个共同的祖先)。

全局参数是每个模块的P1P2P3中的全局变量都是独立的。

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的代码将使用您设置的值。

相关内容

  • 没有找到相关文章

最新更新