如何在Python中解决这种循环依赖

时间:2012-06-15 15:30:56

标签: python circular-dependency circular-reference cyclic-reference

我遇到了一些如下所示的情况,其中每个类都需要另一个类,它会创建循环依赖。我在使用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

4 个答案:

答案 0 :(得分:4)

解决方案(假设无限递归已解决):

  1. 避免这种循环依赖。

  2. 将相互依赖的组件放入同一模块中。

  3. 使用import Aimport B代替from ...表单。 (如果涉及包,在某些情况下可能会失败。)

  4. 使用功能级导入。

答案 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()