У меня есть два модуля, каждый из которых содержит класс, проблема в том, что их классы ссылаются друг на друга.Зависимость модуля Python
Скажем, например, у меня был комнатный модуль и персональный модуль, содержащий CRoom и CPerson.
В классе CRoom содержится информация о комнате и список CPerson каждого в комнате.
Класс CPerson, однако, иногда должен использовать класс CRoom для комнаты, например, чтобы найти дверь, или также увидеть, кто еще находится в комнате.
Проблема с двумя модулями импорта друг друга я просто получаю сообщение об ошибке импорта, на которой когда-либо импортируется второе :(
В C++ я мог бы решить эту проблему, включая только заголовки, а так как в обоих случаях классы просто указатели на другой класс, вперед декларация будет достаточно для заголовка, например:
class CPerson;//forward declare
class CRoom
{
std::set<CPerson*> People;
...
есть в любом случае сделать это в Python, кроме размещения обоих классов в том же модуле, или что-то в этом роде?
редактирование: добавлен пример питона, показывающие проблемы с помощью вышеуказанных классов
ошибка:
Traceback (most recent call last):
File "C:\Projects\python\test\main.py", line 1, in
from room import CRoom
File "C:\Projects\python\test\room.py", line 1, in
from person import CPerson
File "C:\Projects\python\test\person.py", line 1, in
from room import CRoom
ImportError: cannot import name 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)
Вы можете разместить небольшой тест, который воспроизводит вашу ошибку? Я попытался создать два модуля, которые ссылаются друг на друга и не имеют проблем, поэтому я предполагаю, что есть некоторые тонкие моменты, которые мне не хватает. – 2008-10-01 15:50:15
[offtop] Пожалуйста, ознакомьтесь с руководством по стилю Python http://www.python.org/dev/peps/pep-0008/. В частности, удалите первый «C» из имен классов, все остальные имена в вашем примере должны быть в нижнем регистре. Чтобы ответить на ваш вопрос: просто `import room` и в методах Person используйте` room.Room (...) `. – jfs 2008-10-01 17:46:10
Возможно, было бы полезно указать, какие версии python вы используете. Я не думаю, что это проблема для некоторой версии python 3 (я думаю, 3.5, но не 3.4). – 2017-02-08 15:13:50