8

重複の可能性:
Pythonでの循環(または循環)インポート

クラスAのインスタンスをインポートして作成するクラスBがあります。クラス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をインポートし、それを使用します...そうではありません。インポートの問題があります。

ファイルからのエラー aImportError:名前Bをインポートできません

4

3 に答える 3

18

「そうしないでください、あなたは自分を隅に追いやっています」とは別に、必要になるまでBのインポートを延期することもできます。ファイルa.py

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

クラスBをインスタンス化するまでクラスはインポートされません。インスタンス化するまでにA、モジュールはすでにモジュールによって完全にインポートされていますb

共通の基本クラスを使用して、それをテストすることもできます。

于 2012-04-05T10:43:10.570 に答える
2

__init__メソッドにクラスをインポートするだけです

class A:
   def __init__(self, ref):
      from b import B
      assert isinstance(ref, B)
      self.ref = ref
于 2012-04-05T10:43:00.643 に答える
1

この__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
于 2012-04-05T11:26:50.783 に答える