0

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

class Class1(object):
    global_c2 = Class2()

    def foo(self):
        local_c2 = Class2()

class Class2(object):
    pass

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

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

4

2 回答 2

1

您可以执行以下操作(即在声明 Class2 后回填 Class1 的内容。

class Class1(object):
    pass

class Class2(object):
    pass

Class1.global_c2 = Class2()
于 2012-09-30T14:06:11.907 回答
1

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

不同之处在于语句的运行时间。Python 模块中的所有代码都是从上到下执行的——没有声明之类的东西,一切都是定义,每个绑定都是动态的。类定义中的代码在遇到类定义时运行(因此第二个类存在并绑定到 name之前Class2)。函数中的代码在函数被调用时运行,并且因为您在第二个类的定义之前不调用该函数,所以它在您调用该函数时可用。

That's basically what every solution boils down to: Delay binding until whatever you're binding to exists.

于 2012-09-30T14:11:34.900 回答