Ok У меня есть два модуля, каждый из которых содержит класс, проблема в том, что их классы ссылаются друг на друга.
Давайте скажем, например, у меня был комнатный модуль и персональный модуль, содержащий CRoom и CPerson.
В классе CRoom содержится информация о комнате и список CPerson каждого в комнате.
Однако класс CPerson иногда должен использовать класс CRoom для комнаты, например, чтобы найти дверь, или также увидеть, кто еще находится в комнате.
Проблема заключается в том, что оба модуля импортируют друг друга, я просто получаю импортную ошибку, на которой когда-либо импортируется вторая: (
В С++ я мог бы решить это, включив только заголовки, и поскольку в обоих случаях классы имеют указатели на другой класс, для заголовка будет достаточно объявления вперед, например:
class CPerson;//forward declare
class CRoom
{
std::set<CPerson*> People;
...
Есть ли все-таки сделать это в python, кроме размещения обоих классов в одном модуле или что-то в этом роде?
edit: добавлен пример python, показывающий проблему с использованием вышеуказанных классов
Ошибка:
Traceback (последний последний звонок):
Файл "C:\Projects\python\test\main.py", строка 1, на
из комнаты импорт CRoom
Файл "C:\Projects\python\test\room.py", строка 1, на
от лица импорта CPerson
Файл "C:\Projects\python\test\person.py", строка 1, на
из комнаты импорт CRoom
ImportError: невозможно импортировать имя CRoom
room.py
from person import CPerson
class CRoom:
def __init__(Self):
Self.People = {}
Self.NextId = 0
def AddPerson(Self, FirstName, SecondName, Gender):
Id = Self.NextId
Self.NextId += 1#
Person = CPerson(FirstName,SecondName,Gender,Id)
Self.People[Id] = Person
return Person
def FindDoorAndLeave(Self, PersonId):
del Self.People[PeopleId]
person.py
from room import CRoom
class CPerson:
def __init__(Self, Room, FirstName, SecondName, Gender, Id):
Self.Room = Room
Self.FirstName = FirstName
Self.SecondName = SecondName
Self.Gender = Gender
Self.Id = Id
def Leave(Self):
Self.Room.FindDoorAndLeave(Self.Id)