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

How to resolve this kind of Circular dependency in Python

我遇到了如下所示的一些情况,每个类都需要另一个类,它创建了循环依赖关系。我在使用ctypes包装一些C代码时遇到了这种类型情况。关于这个主题已经有很多文章了,但是我觉得它们没有帮助,我需要一些例子。任何解决这一问题的想法/例子都将是有益的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 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


解决方案(假设解决了最小递归):

  • 避免这种循环依赖。

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

  • 使用import Aimport B而不是from ...形式。(如果涉及到包,在某些情况下可能会失败。)

  • 使用函数级导入。


  • 将模块B更改为不导入类C1,直到最后可能的时刻,在__init__.py内:

    1
    2
    3
    4
    5
    class C2(object):
        def __init__(self):
            from A import C1
            self.name ="C2"
            self.c1 = C1()

    请注意,由于C1实例化C2,反之亦然,您最终会遇到一个无限递归问题,但我会很高兴地假设您在示例之外没有这个问题。


    在任何语言中,这都是循环依赖,实际上它是无限递归

    将c2从c1中取出,c1从c2中取出

    1
    2
    3
    4
    5
    6
    7
    from B import C2
    from A import C1

    class C3(object):
      def __init__(self):        
        self.c1 = C1()
        self.c2 = C2()


    由于这是一个循环导入错误,请从模块B中删除import语句->"from a import c1"。

    在需要的地方导入"c1"(方法内部)。

    像这样-从B进口C2

    C1类(对象):

    1
    2
    3
    def __init__(self):
        self.name ="C1"
        self.c2 = C2()

    C2类(对象):

    1
    2
    3
    4
    def __init__(self):
        import A.C1
        self.name ="C2"
        self.c1 = C1()