имя «ClassName» не определено, хотя я уверен, что я импортировал правильно (Python)

1

Я застрял в ошибке, когда вы получаете ошибку имени, хотя я уверен, что я импортировал правильно. Поэтому я пытаюсь создать экземпляр класса из одного файла, ссылаясь на другой. Импорт в основном файле выглядит следующим образом

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 movement и from movement import Player не смог решить проблему. Я предполагаю, что проблема заключается в том, что я импортирую несколько файлов? Вы понятия не имеете. Ниже приведено сообщение об ошибке

NameError: имя 'Player' не определено

  • 0
    какую версию Python вы используете? Вы можете добавить init .py
  • 0
    Я использую Python 3.6.4, я посмотрю init.py спасибо!
Теги:
pygame
nameerror

1 ответ

3
Лучший ответ

Проблема в том, что вы снова импортируете main в файл движений.
Это вызвано тем, что при импорте файла в основном он выполняется, поэтому при запуске main.py вы импортируете движения Move.py, и первое, что вы делаете, - это снова импортируете main. В Python есть некоторые функции, которые допускают циклический импорт, поэтому он не импортирует моменты снова, вызывая бесконечный цикл. Таким образом, python больше не импортирует движения, но устает создавать экземпляр Player, однако Player еще не определен.

У вас есть два решения: либо не импортировать main из файла движений, либо переместить player1 = Player(300, 300, 50, 50, 50) в собственный класс + метод. Например, класс MainGame с методом run(). Или переместите их в блок, как:

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

Это условие является простым условием, которое выполняется только при запуске файла Python, а не при его импорте.

Таким образом, вы можете определить некоторые вещи в вашем main.py, которые можно использовать в движениях. Однако лучше не использовать циклический импорт.

К вашему сведению, полезно посмотреть на трассировку стека, здесь вы можете увидеть, как она перешла из основного в движения, затем вернулась в главное и вызвала ошибку, вместо того, чтобы импортировать перемещения, а затем продолжить работу внутри основного.

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

Надеюсь, это поможет!

  • 0
    Спасибо! Я постараюсь обойти круг!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню