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

时间:2017-01-09 07:49:36

标签: python inheritance global-variables

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

例如。让ba包P1包含BaseClass。假设有两个包P2P3,其中包含相应继承Derived1的类Derived2BaseClass。另外,让P2P3都包含名为gvar的变量(例如,在 init .py文件中定义)。

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

如果在BaseClass构造函数中有gvar的引用,会发生什么?有没有办法确保在Derived1 gvar P2的实例化期间使用?

为什么我要烦扰全局变量:在我的现实生活中,P1P2中有几十个类,我想避免全部更改(添加特定于包的{ {1}}他们的定义,或添加另一个共同的祖先)。

2 个答案:

答案 0 :(得分:1)

Globals 每个模块P1P2P3中的全局都是独立的。

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