Почему я не могу импортировать этот класс?Я не вижу, как это круговой импорт - PullRequest
0 голосов
/ 29 мая 2018

Я сводил с ума эту проблему и не могу понять, что происходит.

Как вы можете видеть ниже в моем файле Display.py, я пытаюсь импортировать класс с именем«Местоположение» из моего файла gameworld.py.

Однако каждый раз, когда я пытаюсь запустить игру, я получаю сообщение об ошибке «Местоположение не определено».Что происходит, что может вызвать это?

Почему один и тот же импорт будет работать в одном файле, но не в этом?

Display.py

from gameworld import *    #I've also tried importing Location directly
screenSize(1500, 800)


bgLocation = Location('introd')

def bgChange():
    bg = bgLocation.room.background
    setBackgroundImage(bg)
    updateDisplay()

gameworld.py

from Display import *
from output import *

class Room:

    def __init__(self, name, description, exits, actions, roominv, roomkey, lock, background):
        self.name = name
        self.description = description
        self.exits = exits
        self.actions = actions
        self.roominv = roominv
        self.roomkey = roomkey
        self.lock = lock
        self.background = background


class Player:

    def __init__(self, name, health):
        self.name = name
        self.health = health


class Location:

    def __init__(self, room):
        self.room = world[room]

    def travel(self, direction, bag):
        if direction not in self.room.exits:
            self.no_exit()
        else:
            self.set_new_room_name(direction, bag)

Для контекста, импорт работал нормально в файле ниже!Чем отличается?

from gameworld import *
from Display import *
from output import *
from audio import *

def main():

    player = Player("Jeff", 100)
    bag = Bag([])
    location = Location('introd')

    command = '  '
    while True:
        command = textBoxInput(wordBox)
        if command in location.room.exits:
            location.travel(command, bag)

1 Ответ

0 голосов
/ 29 мая 2018

В Python такие вещи, как def, class и import также являются операторами.

Модули выполняются во время импорта, и новые функции и классы не будут появляться в пространстве имен модуля до определения def (или класса)оператор был выполнен.

Это имеет некоторые интересные последствия, если вы выполняете рекурсивный импорт.

Рассмотрим модуль X, который импортирует модуль Y, а затем определяет функцию с именем spam:

# module X

import Y

def spam():
    print "function in module x"

Если вы импортируете X из своей основной программы, Python загрузит код для X и выполнит его.Когда Python достигает оператора import Y, он загружает код для Y и начинает выполнять его вместо этого.

В настоящее время Python установил объекты модулей для X и Y в sys.modules.Но X еще ничего не содержит;оператор def spam не был выполнен.

Теперь, если Y импортирует X (рекурсивный импорт), он вернет ссылку на пустой объект X-модуля.Любая попытка доступа к функции X.spam на уровне модуля завершится неудачей.

# module Y

from X import spam # doesn't work: spam isn't defined yet!

Обратите внимание, что вам не нужно использовать from-import, чтобы попасть в неприятности:

# module Y

import X

X.spam() # doesn't work either: spam isn't defined yet!

Чтобы это исправить, либо выполните рефакторинг вашей программы, чтобы избежать циклического импорта (перемещение материала в отдельный модуль часто помогает), либо перенесите импорт в конец модуля (в этом случае, если вы перемещаете импорт Y в конец модуля X), все будет работать нормально).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...