0

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

文件 Main.py:

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

文件瓷砖.py:

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

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

4

3 回答 3

3

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

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

于 2013-01-29T20:35:18.223 回答
1

你有你的导入,并且from需要有模块的名称

from Tile import tile
于 2013-01-29T20:31:35.960 回答
1

Python 开始执行 Main.py。它看到了导入,所以去执行 Tile.py。请注意,它还没有执行类语句!

于是 Python 开始执行 Tile.py。它看到从 Main 导入,并且它已经在内存中拥有该模块,因此它不会重新执行 Main.py 中的代码(如果这样做,更糟糕的事情会出错)。main它试图从模块中取出一个变量Main,但类语句绑定main尚未执行(我们仍在执行 import 语句的过程中,请告知该行)。main因此,您会收到关于模块中没有 clsss 的错误Main(或者Tile,如果您从那里开始)。

您可以通过导入模块而不是从模块中导入类并使用限定名称来避免这种情况,但是当Main.main不起作用时您会掉线。您的代码毫无意义我是动态语言;您不能同时让 class main 的定义等到 aftertile.assign被调用class 的定义tile等到 aftermain.assign被调用。

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

于 2013-01-29T21:08:37.630 回答