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

问题描述 投票:0回答:4

我遇到了一些如下所示的情况,其中每个类需要另一个类,它创建循环依赖。我在使用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
python circular-dependency circular-reference cyclic-reference
4个回答
4
投票

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

  1. 避免这种循环依赖。
  2. 将相互依赖的组件放入同一模块中。
  3. 使用import Aimport B而不是from ...形式。 (如果涉及包,在某些情况下可能会失败。)
  4. 使用功能级导入。

2
投票

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

class C2(object):
    def __init__(self):
        from A import C1
        self.name = "C2"
        self.c1 = C1()

请注意,因为C1实例化C2,反之亦然,你最终会遇到无限递归问题,但我会慈悲地假设你没有在你的插图示例之外出现这个问题。


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

0
投票

由于它是循环导入错误,请从MODULE B - >“从导入C1”中删除import语句。

在需要的地方导入'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()
© www.soinside.com 2019 - 2024. All rights reserved.