0

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

4 回答 4

5

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

  1. 避免这种循环依赖。

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

  3. 使用import Aandimport B而不是from ...表单。(如果涉及到包,这在某些情况下可能会失败。)

  4. 使用函数级导入。

于 2012-06-15T15:35:29.437 回答
2

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

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

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

于 2012-06-15T15:33:41.310 回答
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()
于 2012-06-15T15:42:26.907 回答
0

由于是循环导入错误,请从 MODULE B -> "from 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()
于 2018-03-02T11:48:02.617 回答