我遇到了一些如下所示的情况,其中每个类都需要另一个类,它会创建循环依赖。我在使用ctypes包装一些c代码时遇到了这种类型的情况。 关于这个主题已经有很多帖子,但我没有发现它们有用,我需要一些例子。任何有关解决此问题的想法/示例都会有所帮助。
# Module A
from B import C2
class C1(object):
def __init__(self):
self.name = "C1"
self.c2 = C2()
# Module B
from A import C1
class C2(object):
def __init__(self):
self.name = "C2"
self.c1 = C1()
# Main
from A import C1
if __name__ == "__main__":
o = C1()
print o.name
答案 0 :(得分:4)
解决方案(假设无限递归已解决):
避免这种循环依赖。
将相互依赖的组件放入同一模块中。
使用import A
和import B
代替from ...
表单。 (如果涉及包,在某些情况下可能会失败。)
使用功能级导入。
答案 1 :(得分:2)
将模块B更改为不导入课程C1
,直到__init__.py
内的最后一刻:
class C2(object):
def __init__(self):
from A import C1
self.name = "C2"
self.c1 = C1()
请注意,因为C1
实例化C2
,反之亦然,你最终会遇到无限递归问题,但我会慈善地认为你没有那个问题。插图示例。
答案 2 :(得分:1)
这是任何语言的循环依赖,实际上它是无限递归
从c1中取出c2,从c2取出c1
from B import C2
from A import C1
class C3(object):
def __init__(self):
self.c1 = C1()
self.c2 = C2()
答案 3 :(得分:0)
由于它是循环导入错误,请从MODULE B中删除import语句 - > “来自A import C1”。
导入'C1'你需要的地方(在方法内)。
喜欢这个 - 来自B进口C2
类C1(对象):
def __init__(self):
self.name = "C1"
self.c2 = C2()
C2类(对象):
def __init__(self):
import A.C1
self.name = "C2"
self.c1 = C1()