即使我确定正确导入(Python),也未定义名称“ ClassName”

时间:2018-12-22 11:06:59

标签: python pygame nameerror

即使我确定输入正确,也遇到U出现名称错误的错误。因此,我试图从一个引用另一个的文件创建一个类实例。主文件中的导入看起来像这样

from movement import *
from maps import *
import pygame
import sys

pygame.init() 

# Player class is in the movement file
player1 = Player(300, 300, 50, 50, 50)

这是运动文件

from maps import *
from main import *
import pygame

pygame.init()

objectAmount = 0


class Player:
    def __init__(self, pos_x, pos_y, width, height, speed):
         self.pos_x = pos_x
         self.pos_y = pos_y
         self.speed = speed
         self.width = width
         self.height = height
         self.player_image = pygame.image.load("Munir.png")
         self.image_rect = self.player_image.get_rect()

我尝试使用import movementfrom movement import Player 没有成功解决问题。我猜问题出在我可能导入几个文件中?你什么都不知道以下是错误消息

  

NameError:未定义名称“玩家”

1 个答案:

答案 0 :(得分:3)

问题在于您正在将main重新导入到动作文件中。
这是因为导入文件基本上是在运行该文件,因此在运行main.py时,您将导入Movements.py,首先要做的一件事情是再次导入main。 python中有一些功能允许循环导入,这就是为什么它不会再次导入瞬间而导致无限循环的原因。因此python不会再次导入动作,而是会创建一个Player实例,但是尚未定义Player。

您有两种解决方案,要么不从移动文件中导入main,要么将player1 = Player(300, 300, 50, 50, 50)移到自己的类+方法中。例如带有run()方法的MainGame类。或将它们移动到一个块中:

if __name__ == "__main__":
    player1 = Player(300, 300, 50, 50, 50)
    #... main loop of your game.

该条件是一个简单条件,仅当您运行python文件而不是将其导入时才成立。

这样,您可以在main.py中定义一些可用于移动的东西。但是,最好不要使用循环导入。

仅供参考,查看堆栈跟踪很有用,在这里您可以看到堆栈如何从main进入运动,然后回到main并导致错误,而不是导入运动,然后继续在main内部运行。

Traceback (most recent call last):
  File "main.py", line 1, in <module>
    from movement import *
  File "/home/user/temp/so/movement.py", line 2, in <module>
    from main import *
  File "/home/user/temp/so/main.py", line 9, in <module>
    player1 = Player(300, 300, 50, 50, 50)
NameError: name 'Player' is not defined

希望有帮助!