Ok Mam dwa moduły, z których każdy zawiera klasę, problem polega na tym, że ich klasy odwołują się nawzajem.Zależność od modułu Pythona
Powiedzmy na przykład, że miałem moduł pokojowy i moduł osoby zawierający CRoom i CPerson.
Klasa CRoom zawiera informacje o pokoju i listę CPerson każdego z pokoi.
Klasy CPerson jednak czasami trzeba użyć klasy CRoom dla pokoju, w którym się znajduje, na przykład, aby znaleźć drzwi, lub też zobaczyć, kto jeszcze jest w pokoju.
Problem jest z dwóch modułów importu siebie po prostu pojawia się błąd importu, na których kiedykolwiek jest importowany sekund :(
w C++ mogę rozwiązać ten problem poprzez włączenie tylko nagłówki, a ponieważ w obu przypadkach zajęcia prostu odnośniki do drugiej klasy, do przodu deklaracja wystarczy dla nagłówka np:
class CPerson;//forward declare
class CRoom
{
std::set<CPerson*> People;
...
Czy mimo to zrobić w Pythonie, inne niż umieszczenie obu klas w tym samym module czy coś takiego?
edit: dodaje python przykład pokazujący problem, stosując powyższe zajęcia
błąd:
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)
można dodawać niewielką przypadek testowy, który odtwarza swój błąd? Próbowałem stworzyć dwa moduły, które odwołują się do siebie i nie mają problemów, więc zakładam, że jest jakiś subtelny punkt, którego mi brakuje. –
[offtop] Przeczytaj przewodnik w stylu Pythona http://www.python.org/dev/peps/pep-0008/. W szczególności upuść pierwsze "C" od nazw klas, wszystkie inne nazwy w twoim przykładzie powinny być pisane małymi literami. Aby odpowiedzieć na twoje pytanie: po prostu "zaimportuj pomieszczenie", a w metodach osoby użyj "room.Room (...)". – jfs
może być przydatne wspomnieć, których wersji python używasz. Nie sądzę, jest to problem dla niektórych wersji Pythona 3 (myślę, że 3.5, ale nie 3.4). –