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 Aandを使用します。(パッケージが関係している場合、これは特定の状況で失敗する可能性があります。)import Bfrom ...

  4. 関数レベルのインポートを使用します。

于 2012-06-15T15:35:29.437 に答える
2

C1モジュール B を変更して、可能な限り最後の瞬間までクラスをインポートしないようにし__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

Circular import エラーですので、MODULE B → from A import 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()
于 2018-03-02T11:48:02.617 に答える