在Python中使用静态类变量

时间:2013-01-29 20:29:45

标签: python oop class variables circular-dependency

Python不允许我将类导入到彼此中。我知道Python中没有“包”解决方案,所以我不确定如何做到这一点。看看我的文件代码:

文件Main.py:

from Tile import tile
tile.assign()
class main:
    x = 0
    @staticmethod
    def assign():
        tile.x = 20

文件Tile.py:

from Main import main
main.assign()
class tile:
    x = 0
    @staticmethod
    def assign():
        main.x = 20

我收到错误“无法导入类图块”。

3 个答案:

答案 0 :(得分:3)

如果文件A导入文件B,而文件B导入文件A,则它们将无限期地相互导入,直到程序崩溃。

您需要以不需要此循环依赖关系的方式重新思考您的逻辑。例如,第三个文件可以导入两个文件并执行两个分配。

答案 1 :(得分:1)

您的导入向后,from需要具有模块的名称

from Tile import tile

答案 2 :(得分:1)

Python开始执行Main.py.它看到导入,因此执行Tile.py. 请注意,它尚未执行类声明!

所以Python开始执行Tile.py.它看到从Main导入,并且它已经在内存中有该模块,因此它不会重新执行Main.py中的代码(如果有的话,更糟糕的事情会出错)。它试图从main模块中提取变量Main,但是类语句绑定main尚未执行(我们仍然在执行import语句的过程中,建议那条线)。因此,如果您从模块main(或Main开始,如果您从那里开始),则会收到错误Tile

您可以通过导入模块而不是从模块中导出类并使用限定名称来避免这种情况,但是当Main.main不起作用时,您将失去一行。你的代码毫无意义我是一个动态的语言;你不能两个类主要的定义等到tile.assign被调用之后tile的定义等到{之后} { {1}}已被调用。

如果你真的需要这种循环依赖(通常,但并不总是表明在设计阶段出现了问题),那么你需要将“脚手架”分开,比如定义类和函数以及“执行”中的变量,你实际上调用类和函数或使用变量。然后你的循环导入的“脚手架”将工作,即使在导入过程中没有任何模块将被正确初始化,并且当你开始“执行”时,一切都将起作用。