我在同一个模块中定义了两个类,并希望在第一个模块中使用第二个类(作为全局变量):
class Class1(object):
global_c2 = Class2()
def foo(self):
local_c2 = Class2()
class Class2(object):
pass
global_c2收到错误但local_c2没有收到错误。这是有道理的,因为当编译器浏览此文件时,它将不知道Class2将存在。此外,如果我切换类,以便首先定义Class2,它就可以工作。
然而,我想知道是否有另一种方法来解决这个问题。也许我可以告诉python Class2将会存在,所以不要担心它,或者我只需要按正确的顺序排列它们吗?
答案 0 :(得分:1)
您可以执行以下操作(即,一旦声明Class2,就回填Class1的内容。
class Class1(object):
pass
class Class2(object):
pass
Class1.global_c2 = Class2()
答案 1 :(得分:1)
编译器在这里没有做任何事情。在这两种情况下,生成完全相同的字节码序列以在运行时查找类并实例化它。
区别在于语句运行的时间。 Python模块中的所有代码都是从底部执行的 - 没有声明这样的东西,一切都是定义,每个绑定都是动态的。遇到类定义时会运行类定义中的代码(因此在第二个类生成并绑定到名称Class2
之前)。函数中的代码在调用函数时运行,并且因为在第二个类的定义之前没有调用函数,所以在调用该函数时它可用。
这基本上就是每个解决方案归结为:延迟绑定,直到存在任何绑定为止。