【发布时间】:2010-09-14 13:39:35
【问题描述】:
好的,我有两个模块,每个模块都包含一个类,问题是它们的类相互引用。
假设我有一个房间模块和一个包含 CRoom 和 CPerson 的人员模块。
CRoom 类包含有关房间的信息,以及房间中每个人的 CPerson 列表。
但是,CPerson 类有时需要使用 CRoom 类作为其所在的房间,例如寻找门,或者查看房间里还有谁。
问题在于两个模块相互导入我只是得到一个导入错误,第二个导入的是哪个模块:(
在 c++ 中,我可以通过只包含标题来解决这个问题,因为在这两种情况下,类都只有指向另一个类的指针,所以前向声明就足够了,例如:
class CPerson;//forward declare
class CRoom
{
std::set<CPerson*> People;
...
除了将两个类放在同一个模块或类似的东西中之外,在 python 中还有其他方法吗?
编辑:添加了显示使用上述类的问题的python示例
错误:
回溯(最近一次通话最后一次):
文件“C:\Projects\python\test\main.py”,第 1 行,在
从房间导入 C Room
中的文件“C:\Projects\python\test\room.py”,第 1 行 从人导入 CPerson
中的文件“C:\Projects\python\test\person.py”,第 1 行 从房间导入 C Room
ImportError: 无法导入名称 C 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)
【问题讨论】:
-
你能发布一个小测试用例来重现你的错误吗?我尝试创建两个相互引用并且没有问题的模块,所以我认为我遗漏了一些微妙的点。
-
[offtop] 请阅读 Python 风格指南 python.org/dev/peps/pep-0008 。特别是,从类名中删除第一个“C”,示例中的所有其他名称都应为小写。要回答您的问题:只需
import room并在 Person 的方法中使用room.Room(...)。 -
提及您使用的 python 版本可能会很有用。我认为这对于某些版本的 python 3 来说不是问题(我认为是 3.5 但不是 3.4)。
标签: python module circular-dependency