'module'对象没有属性'Player'

时间:2013-08-05 23:24:18

标签: python class module attributeerror

我正在尝试制作一个简单的游戏,它有多个需要相互导入的文件。我的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()

1 个答案:

答案 0 :(得分:0)

这里的问题是循环导入。

由于您没有给我们足够的代码来实际测试,因此无法提供确切的详细信息。如果您想亲眼看到它,只需在每个print之前和之后添加import,您就可以看到事件的顺序。但它会是这样的:

player取决于mainmain取决于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推荐。)