我正在尝试制作一个简单的游戏,它有多个需要相互导入的文件。我的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
player.py:
import main
import world
world = world.World()
class Player:
#Definition
world.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()
答案 0 :(得分:0)
这里的问题是循环导入。
由于您没有给我们足够的代码来实际测试,因此无法提供确切的详细信息。如果您想亲眼看到它,只需在每个print
之前和之后添加import
,您就可以看到事件的顺序。但它会是这样的:
player
取决于main
。 main
取决于mob
。因此,当您尝试import player
时,在运行任何顶级代码之前,必须运行所有mob
的顶级代码。但mob
尝试在顶层创建player.Player
对象。由于player
仍在等待import main
完成,因此尚未运行代码来定义该类。因此错误。
The official FAQ对解决此问题的不同方法有一个很好的答案。在你的情况下,我认为有一个简单的答案:
将main.py
拆分为两个单独的模块。获取其他人需要导入的共享代码,并将其放入utils.py
。保留需要导入main.py
中其他所有人的顶级程序代码。将每个import main
更改为import utils
。就是这样;没有更多的循环进口。 (这实际上是Matthias Ulrichs在FAQ中提出的建议,但更具体地说明了你的情况 - 事实上,在Python新手创建的项目中非常常见,特别是那些熟练掌握具有单独导入和实现文件的语言的人。 )
如果在您的情况下这不可行,请考虑将一些全局初始化移动到初始化函数,您可以在完成所有import
之后调用它们。 (这实际上是来自常见问题解答的Guido推荐。)