-1

我正在尝试制作一个简单的游戏,它有多个需要相互导入的文件。我的 mob 模块需要导入我的播放器模块并执行 player = player.Player() 来创建一个新的类实例。该类位于 player.py 文件中,但显然无法识别。

我在我的 mob 文件中做了 world = world.World() ,并且效果很好,所以我对为什么我的播放器文件不起作用感到困惑。

player.__file__ shows the correct path so that's not the issue.

这就是我在 mob.py 开头所拥有的:

import world
import main
import player

world = world.World()
player = player.Player()

class Mob:
    #Class definition

播放器.py:

import main
import world

world = world.World()

class Player:
    #Definition

世界.py:

import os
import main

class World:
    #Definition

不确定这是否有帮助,但这是 main.py 中的主要功能:

if __name__ == "__main__":
    console = []
    player = player.Player()
    movePlayer = player.Move
    transformPlayer = player.Transform
    goblin = mob.Mob()
    world = world.World()
    mapSize = world.MapSize
    mainMenu()
4

1 回答 1

0

这里的问题是循环导入。

由于您没有给我们足够的代码来实际测试它,因此不可能给出确切的细节。如果你想自己看,只要print在每个前后加一个import,就可以看到事件的先后顺序。但它会是这样的:

player取决于mainmain取决于mob。因此,当您尝试 时import player,在它可以运行任何顶级代码之前,必须运行所有mob顶级代码。但mob试图player.Player在顶层创建一个对象。由于player仍在等待import main完成,它还没有运行代码来定义该类。因此错误。

官方常见问题解答对解决此问题的不同方法有一个很好的答案。在你的情况下,我认为有一个简单的答案:

分成main.py两个独立的模块。获取其他人需要导入的共享代码,并将其放入,例如,utils.py. 将需要导入其他所有人的顶级程序代码留在main.py. 将每个更改import mainimport utils。就是这样;不再循环进口。(这实际上是来自 FAQ 的 Matthias Ulrichs 的建议,但更具体到您的情况——而且碰巧在 Python 新手创建的项目中非常常见,尤其是那些非常熟练掌握具有单独导入和实现文件的语言的项目。 )

如果这在您的情况下不可行,请考虑将一些全局初始化移动到初始化函数,您可以在所有imports 完成后调用它们。(这实际上是常见问题解答中 Guido 的建议。)

于 2013-08-06T16:32:14.543 回答