在 Python 中使用静态类变量

问题描述 投票:0回答:4

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

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

python oop class variables circular-dependency
4个回答
3
投票

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

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


1
投票

您向后导入,并且

from
需要具有模块的名称

from Tile import tile

1
投票

Python 开始执行 Main.py。它看到导入,因此去执行 Tile.py。 注意它还没有执行class语句!

因此Python开始执行Tile.py。它看到来自 Main 的导入,并且内存中已经有该模块,因此它不会重新执行 Main.py 中的代码(如果这样做,更糟糕的事情会出错)。它尝试从

main
模块中取出变量
Main
,但类语句绑定
main
尚未执行(我们仍在执行 import 语句的过程中,建议该行)。因此,您会收到有关模块
main
(或
Main
,如果您从那里开始的话)中没有 classss
Tile
的错误。

您可以通过导入模块而不是从模块中导入类并使用限定名称来避免这种情况,但是当

Main.main
不起作用时,您会下降一行。你的代码毫无意义我是动态语言;你不能让类main的定义等到
tile.assign
被调用之后
tile
的定义等到
main.assign
被调用之后。

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


0
投票

您所要做的就是添加

    def __init__(self) -> None:
    pass
© www.soinside.com 2019 - 2024. All rights reserved.