У объекта 'module' нет атрибута 'Player'
Я пытаюсь сделать простую игру, в которой есть несколько файлов, которые нужно импортировать друг другу. Моему мобильному модулю нужно импортировать мой модуль проигрывателя и выполнить player = player.Player(), чтобы создать новый экземпляр класса. Класс находится в файле player.py, но он, очевидно, не распознается.
Я сделал 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 ответ
Проблема здесь заключается в круговом импорте.
Поскольку вы не дали нам достаточно кода, чтобы на самом деле протестировать это, невозможно дать точные детали. Если вы хотите увидеть это сами, просто добавьте print
до и после каждого import
и вы можете увидеть последовательность событий. Но это будет примерно так:
player
зависит от main
, main
зависит от mob
, Итак, когда вы пытаетесь import player
прежде чем он сможет запустить какой-либо код верхнего уровня, все mob
код верхнего уровня должен работать. Но mob
пытается создать player.Player
Объект на верхнем уровне. поскольку player
все еще ждет import main
чтобы закончить, он еще не запустил код для определения этого класса. Отсюда и ошибка.
В официальном FAQ есть хороший ответ о том, как это исправить. В вашем случае, я думаю, есть простой ответ:
Трещина main.py
на два отдельных модуля. Возьмите общий код, который нужно импортировать всем остальным, и поместите его, скажем, в utils.py
, Оставьте программный код верхнего уровня, который нужно импортировать всем остальным в main.py
, Изменить каждый import main
в import utils
, И это все; больше нет кругового импорта. (Это, по сути, рекомендация Матиаса Ульриха из FAQ, но более конкретная для вашей ситуации - и, как это бывает, очень распространено среди проектов, созданных новичками в Python, особенно тех, кто очень хорошо владеет языками, которые имеют отдельные файлы импорта и реализации.)
Если это не выполнимо в вашем случае, рассмотрите возможность перемещения некоторых глобальных инициализаций в функции инициализации, которые вы можете вызывать после всех import
с сделано. (Это фактически рекомендация Гвидо из FAQ.)