【问题标题】:Resolve circular import error in python [duplicate]解决python中的循环导入错误[重复]
【发布时间】:2012-04-19 02:22:44
【问题描述】:

可能重复:
Circular (or cyclic) imports in Python

我有 B 类,它导入并创建 A 类的实例。 A 类需要在其构造函数中引用 B,因此包含 B。

from a import A
class B:
  def __init__(self):
    self.a = A()

from b import B
class A:
  def __init__(self, ref):
    assert isinstance(ref, B)
    self.ref = ref

这不起作用。主文件导入 B 并使用它......不是。 导入有问题。

来自文件 a 的错误 ImportError: 无法导入名称 B

【问题讨论】:

  • 不,这行不通。所以,不要那样做。
  • 不是答案,但最好有一个不需要这种循环导入的更好的设计。
  • 明白。但这似乎是一个基本问题。类需要参考上层...

标签: python class python-import


【解决方案1】:

除了“不要那样做,你把自己画到角落里了”,你也可以推迟 B 的导入,直到你需要它。档案a.py

class A:
    def __init__(self, ref):
        from b import B
        assert isinstance(ref, B)
        self.ref = ref

在您实例化类 A 之前,不会导入类 B,此时模块已经被模块 b 完全导入。

您也可以使用通用基类并对其进行测试。

【讨论】:

  • 谢谢,我会同意的。我在某处看到了这个想法,但无法理解。您的补充说明非常好!
【解决方案2】:

只需在__init__ 方法中导入类

class A:
   def __init__(self, ref):
      from b import B
      assert isinstance(ref, B)
      self.ref = ref

【讨论】:

    【解决方案3】:

    __init__ 方法在您创建类的实例时执行。在这种情况下,您应该通过简单地更改导入语句来使其工作,如下所示:

    import a 
    class B:
      def __init__(self):
        self.a = a.A(self)
    

    import b
    class A:
      def __init__(self, ref):
        assert isinstance(ref, b.B)
        self.ref = ref
    

    【讨论】:

      猜你喜欢
      • 2020-04-15
      • 2020-11-01
      • 2017-11-19
      • 2023-03-29
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多