У объекта '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.)

Другие вопросы по тегам