Ok Ich habe zwei Module, die jeweils eine Klasse enthält, das Problem ist, ihre Klassen aufeinander verweisen.Python-Modul Abhängigkeit
Hier können zum Beispiel sagen, dass ich ein Raummodul hatte und eine Person Modul Croom und CPerson enthält.
Die Croom-Klasse enthält Informationen zum Thema Raum und eine CPerson Liste eines jeden im Raum.
Die Klasse CPerson aber manchmal braucht die Croom Klasse für das Zimmer seiner in verwenden, zum Beispiel die Tür zu finden oder zu sehen, wer sonst noch im Raum ist.
Das Problem ist mit den beiden Modulen sie importieren ich einen Importfehler nur bekommen, auf der jemals zweite importiert wird :(
in C++ ich dies nur lösen könnte, indem die Header einschließlich, und da in beiden Fällen die Klassen haben nur Zeiger auf die anderen Klasse, eine Vorwärtsdeklaration für den Header zB ausreichen würde:
class CPerson;//forward declare
class CRoom
{
std::set<CPerson*> People;
...
gibt es trotzdem, dies in python zu tun, außer beiden Klassen im gleichen Modul oder so ähnlich platzieren?
bearbeiten: added python Beispiel zeigt Problem oben Klassen
Fehler mit:
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)
Können Sie sich einen kleinen Testfall schreiben, dass Ihre Fehler reproduziert? Ich habe versucht, zwei Module zu erstellen, die aufeinander verweisen und keine Probleme haben, also nehme ich an, dass es einen subtilen Punkt gibt, den ich vermisse. –
[offtop] Bitte lesen Sie den Python Style Guide http://www.python.org/dev/peps/pep-0008/. Lassen Sie insbesondere das erste "C" von den Klassennamen fallen, alle anderen Namen in Ihrem Beispiel sollten in Kleinbuchstaben geschrieben sein. Um Ihre Frage zu beantworten: Verwenden Sie einfach 'Raum importieren' und in den Methoden von Personen' Raum.Raum (...) '. – jfs
Es könnte nützlich sein zu erwähnen, welche Versionen von Python Sie verwenden. Ich denke nicht, dass dies ein Problem für eine Version von Python 3 ist (ich denke 3.5, aber nicht 3.4). –