それぞれがクラスを含む 2 つのモジュールがあります。問題は、それらのクラスが相互に参照していることです。
たとえば、room モジュールと CRoom と CPerson を含む person モジュールがあるとします。
CRoom クラスには、ルームに関する情報と、ルーム内のすべての人の CPerson リストが含まれています。
ただし、CPerson クラスは、たとえばドアを見つけたり、部屋に他の人がいるかどうかを確認したりするために、その部屋に CRoom クラスを使用する必要がある場合があります。
問題は、2 つのモジュールが相互にインポートしていることです。2 番目にインポートされたモジュールでインポート エラーが発生します :(
C ++では、ヘッダーのみを含めることでこれを解決できました。どちらの場合も、クラスには他のクラスへのポインターがあるだけなので、ヘッダーには前方宣言で十分です。
class CPerson;//forward declare
class CRoom
{
std::set<CPerson*> People;
...
両方のクラスを同じモジュールなどに配置する以外に、Pythonでこれを行う方法はありますか?
編集:上記のクラスを使用した問題を示すpythonの例を追加
エラー:
トレースバック (最後の最後の呼び出し):
ファイル "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)