Импорт экземпляра класса из другого модуля

У меня есть модуль с именем каталог и другой модуль с именем видов. Всегда будет только один каталог, независимо от того, сколько видов у меня есть.

В модуле каталога у меня есть 1 класс каталога. Внутри модуля «Виды» у меня много разных классов видов.

#module named directory
class directory:

    def __init__(self):
        ...

    def add_to_world(self, obj, name, zone = 'forrest', space = [0, 0]):
        ...


#module named species
class Species (object):

def __init__(self, atlas):
    self.atlas = atlas

def new(self, object_species, name, zone = 'holding'):
    self.object_species = object_species
    self.name = name
    self.zone = zone
    self.atlas.add_to_world(object_species, name)

class Lama(Species):

def __init__(self, name, atlas, zone = 'forrest'):
    self.new('Lama', name)
    self.at = getattr(Entity, )
    self.atlas = atlas

Проблема в том, что в каждом из моих классов я должен передать объект атласа этому виду. Как я могу просто сказать видам, чтобы получить экземпляр из другого модуля.

Пример, если у меня есть экземпляр «Атласа» В модуле с именем Entity с классом Entity, как я могу сказать всем видам с помощью нескольких строк кода, чтобы получить этот экземпляр из Entity?

 BrenBarn08 июн. 2012 г., 07:02
Ваш вопрос трудно понять. Вы можете импортировать экземпляр так же, как и все остальное. Если ваш модуль Entity создает экземпляр x, вы можете сделатьimport Entity.x в любом другом модуле, чтобы импортировать этот экземпляр.
 gauden08 июн. 2012 г., 19:37
Смотрите такжеthis question @ user1082764 - это вежливо для перекрестных ссылок связанных / идентичных вопросов.

Ответы на вопрос(1)

как мне сохранить глобальный атлас для всех моих видов, пример шаблона Синглтон?Смотрите этот ТАК вопрос.

Одним из способов сделать это, просто и Pythonically, является наличие модуля в файлеdirectory.py который содержит весь связанный с каталогом код и глобальныйatlas переменная:

atlas = []

def add_to_world(obj, space=[0,0]):
    species = {'obj' : obj.object_species,
               'name' : obj.name,
               'zone' : obj.zone,
               'space' : space}
    atlas.append( species )

def remove_from_world(obj):
    global atlas
    atlas = [ species for species in atlas
              if species['name'] != obj.name ]

# Add here functions to manipulate the world in the directory

Тогда в вашем основном сценарии различные виды могут ссылаться на этот глобальныйatlas импортируяdirectory модуль, таким образом:

import directory

class Species(object):
    def __init__(self, object_species, name, zone = 'forest'):
        self.object_species = object_species
        self.name = name
        self.zone = zone
        directory.add_to_world(self)

class Llama(Species):
    def __init__(self, name):
        super(Llama, self).__init__('Llama', name)

class Horse(Species):
    def __init__(self, name):
        super(Horse, self).__init__('Horse', name, zone = 'stable')


if __name__ == '__main__':
    a1 = Llama(name='LL1')
    print directory.atlas
    # [{'obj': 'Llama', 'name': 'LL1', 'zone': 'forest', 'space': [0, 0]}]


    a2 = Horse(name='H2')
    print directory.atlas
    # [{'obj': 'Llama', 'name': 'LL1', 'zone': 'forest', 'space': [0, 0]},
    #  {'obj': 'Horse', 'name': 'H2', 'zone': 'stable', 'space': [0, 0]}]

    directory.remove_from_world(a1)
    print directory.atlas
    # [{'obj': 'Horse', 'name': 'H2', 'zone': 'stable', 'space': [0, 0]}]

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

Ваш ответ на вопрос