2012-06-27 3 views
0

Я работаю над текстовым приложением, которое хранит уровни как массивный словарь под названием «места». Вместо того, чтобы иметь его в основном файле, я подумал, что создаю отдельный файл под названием «levels.py», который будет содержать его, что сделает мой код более чистым и избавит вас от необходимости использовать более 450 строк другого кода для добавления к нему ,Импорт модуля, который импортирует главный модуль

Итак, основной файл игры:

from levels import places 

class Thing: 
    #Some stuff 

levels.py:

from game import * 
places = { 
    "bleh" : Thing("bleh"), 
} 

Похоже, что 'мест' не определен в игре, однако.

Я думаю, что происходит то, что есть «цикл» импорта. Однако, если level.py необходимо импортировать классы из game.py, как я могу предотвратить что-то подобное?

+1

Вы не можете иметь круговую зависимость. Разделите свои модули правильно. –

+0

Ну, ты * можешь *, но это плохая идея. – geoffspear

+0

Мои классы также требуют словаря. – Cheezey

ответ

5

Для устранения круговых зависимостей всегда можно использовать refactor. Переместить Thing в thing.py, затем в game.py и в levels.py использовать from thing import Thing. Промыть и повторить.

+0

Спасибо, но поскольку у меня есть много классов, я просто поместил их все в новый файл с именем «classes.py», и оба файла импортировали это. Кроме того, это приводит к тому, что game.py имеет более реальный игровой процесс и меньше определений классов. – Cheezey

+0

@Cheezey, 'import game \\ ... \\" bleh ": game.Thing (" bleh ")' – astynax

0

Вы можете изменить levels, чтобы иметь инициализатор или заводский метод, который принимает объект, предоставленный game.

Например:

# levels.py 
# no import needed here; we'll just take an instance when required 
def get_places(thing): 
    return {"bleh": thing("bleh")} 

# game.py 

import levels 

class Thing: 
    def __init__(self): 
     self.places = levels.get_places(self) 

Edit:

Еще лучше было бы, чтобы переместить данные, что оба класса нужно в другой класс, что они могут и легко получать доступ к или импорта. Например, объект состояния игры, который передается между классами с функциональностью.

Смежные вопросы