如何在Python脚本中为导入的类获得相同的作用域?

如何在Python脚本中为导入的类获得相同的作用域?,python,python-2.7,scope,python-import,global-scope,Python,Python 2.7,Scope,Python Import,Global Scope,脚本中定义的类的作用域似乎与导入到脚本中的类的作用域不同。例如: def PrintGlobals(): print globals() class bar(object): def __init__(self, PrintGlobals): self.PrintGlobals = PrintGlobals self.PrintGlobals() classinternal = bar(PrintGlobals) 在foo.py文件中: cl

脚本中定义的类的作用域似乎与导入到脚本中的类的作用域不同。例如:

def PrintGlobals():
    print globals()

class bar(object):
    def __init__(self, PrintGlobals):
        self.PrintGlobals = PrintGlobals
        self.PrintGlobals()

classinternal = bar(PrintGlobals)
在foo.py文件中:

class foo(object):
    def __init__(self):
        print globals()
在我的主文件中:

from foo import foo

class bar(object):
    def __init__(self):
        print globals()

classimport = foo()
classinternal = bar()
从foo和bar返回的globals列表是不同的-为什么会这样

这让生活变得困难,因为任何需要访问主globals()的类都必须驻留在主文件中。如何确保导入的类具有相同的全局作用域?在阅读其他帖子后,我尝试了以下几点:

感谢您的帮助

[编辑]---

因此,根据上面的链接,这是一个简单的回答。事实证明,范围并不是跨模块共享的。它提到了几种解决方法,但在我的例子中,我需要实际创建/读取/写入全局变量。因此,我在主脚本中创建了一个例程,并在初始化foo和bar时将其作为对象传递。例如:

def PrintGlobals():
    print globals()

class bar(object):
    def __init__(self, PrintGlobals):
        self.PrintGlobals = PrintGlobals
        self.PrintGlobals()

classinternal = bar(PrintGlobals)
(这不是我的选择,在我有时间使用应用程序开发人员之前,这是一个黑客行为:-)

Python 3要说的是:

在Python中,仅在函数内部引用的变量是隐式全局变量。如果在函数体中的任何位置为变量赋值,则假定该变量为局部变量,除非显式声明为全局变量

虽然一开始有点令人惊讶,但经过片刻的考虑就可以解释这一点。一方面,为指定的变量要求全局变量提供了防止意外副作用的屏障。另一方面,如果所有全局引用都需要global,那么您将一直使用global。您必须将对内置函数或导入模块组件的每个引用声明为全局引用。这种混乱将破坏《全球宣言》在确定副作用方面的作用

要在不同的作用域中查看全局变量,请尝试在执行过程中的不同点进行打印(globals())。例如:在运行任何代码之前,在顶层模块中,然后在
\uuuu init\uuuu.py
中(因为您导入了foo),在foo的模块级别,在每个函数中,以及在修改传递给函数的任何变量之前/之后

进一步解释:

我认为这里缺少的关键是每个模块都有自己的“全局”名称空间。这一点一开始可能有点混乱,因为在像C这样的语言中,所有外部变量和函数都共享一个全局名称空间。但是一旦你超越了这个假设,Python的方式就非常有意义了


但是请注意,当您导入包或包中的模块时,包
\uuuu init\uuuuuy.py
文件中指定的所有名称都可以在包命名空间中使用。

最好不要使用全局变量,而是将所需信息传递给数据类型中的函数或方法。例如,如果您使用字典,那么这对**kwargs非常有效。或者考虑使用PyyAML这样的包来读取配置文件,如果需要的话。您试图解决的具体问题是什么?全局函数属于定义函数的模块。可能会给你一个关于这个问题的很好的概述。
def PrintGlobals():
    print globals()

class bar(object):
    def __init__(self, PrintGlobals):
        self.PrintGlobals = PrintGlobals
        self.PrintGlobals()

classinternal = bar(PrintGlobals)