对象不能全局创建,但可以本地python

时间:2012-09-30 14:04:08

标签: python class module global local

我在同一个模块中定义了两个类,并希望在第一个模块中使用第二个类(作为全局变量):

class Class1(object):
    global_c2 = Class2()

    def foo(self):
        local_c2 = Class2()

class Class2(object):
    pass

global_c2收到错误但local_c2没有收到错误。这是有道理的,因为当编译器浏览此文件时,它将不知道Class2将存在。此外,如果我切换类,以便首先定义Class2,它就可以工作。

然而,我想知道是否有另一种方法来解决这个问题。也许我可以告诉python Class2将会存在,所以不要担心它,或者我只需要按正确的顺序排列它们吗?

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作(即,一旦声明Class2,就回填Class1的内容。

class Class1(object):
    pass

class Class2(object):
    pass

Class1.global_c2 = Class2()

答案 1 :(得分:1)

编译器在这里没有做任何事情。在这两种情况下,生成完全相同的字节码序列以在运行时查找类并实例化它。

区别在于语句运行的时间。 Python模块中的所有代码都是从底部执行的 - 没有声明这样的东西,一切都是定义,每个绑定都是动态的。遇到类定义时会运行类定义中的代码(因此第二个类生成并绑定到名称Class2之前)。函数中的代码在调用函数时运行,并且因为在第二个类的定义之前没有调用函数,所以在调用该函数时它可用。

这基本上就是每个解决方案归结为:延迟绑定,直到存在任何绑定为止。