2017-02-02 3 views
0

私のコードは少し複雑です:のpythonはImportError:私は例を紹介しますので、名前をインポートすることはできません

ファイルA.py:

from B import B 

class A(): 

def __init__(self): 

    self.id = 5 

    self.b = B() 

ファイルB.py

from A import A 

class B(): 

def __init__(self): 

    self.id = 15 

    self.a = A() 

これは例外です:

Traceback (most recent call last): 
File "F:/Project/Code/A.py", line 1, in <module> 
from B import B 
File "F:\Project\Code\B.py", line 1, in <module> 
from A import A 
File "F:\Project\Code\A.py", line 1, in <module> 
from B import B 
ImportError: cannot import name B 

すべて私は、AにAのインスタンスを含むBとBのインスタンスを格納したいと思います。私がしなければならないことは、それらを単一のファイルに変換することですが、私のコードはもっと大きなスケールにあります私の先生は1つの長いコードの代わりに複数の短いスクリプトを保存しなければならない。

ご意見をお寄せください。

+1

「私が望むすべてが含まれているためにBとBのインスタンスが含まれていることですインスタンスA " - たとえあなたが循環インポート問題を解決しても、これは基本的にはbです荒れたデザイン。 AにはBがあり、Bには別のBなどが含まれています。これらのオブジェクトの1つを作成するには、無限の数のオブジェクトを作成する必要があります。 – user2357112

+1

この質問を参照してください:http://stackoverflow.com/questions/11698530/two-python-modules-require-each-others-contents-can-that-work – ScottSmudger

+0

私は彼が何らかの形で最大の作成再帰の深さを指定できると思いますが、それはかなり重いメタトピック – Woody1193

答えて

0

スクリプトに再帰的なインポートがあるため、エラーが発生しています。

A.pyは、B moduleに依存します。しかし、B.pyA moduleに依存します。そして、Pythonはインポートを解決できません。

すべてのクラスを1つのモジュールに書き込むことができます。または、循環依存性がないことを確認してください。

変数、関数のインポートでも同じ問題が発生する可能性があります。

+0

誰かがそれについて話したい場合。コメントを書く。なぜ私の答えが役に立たないのか分かりません。 –

+0

ロールバックしてくれてありがとう... –

+1

ああ - 私はそれをロールバック編集と読み返し投票の両方で読んだので、編集履歴をチェックしています(上記の私の最初の読んだものは、あなたは大丈夫だと思った)。謝罪、そこに。 –

0

Aのすべてのbプロパティが、のインスタンスであり、それ自体がAなどであることを意味するため、双方向の依存関係はありません。

A 
- id: 5 
- b: B 
    - id: 15 
    - a: A 
      - id: 15 
      - b: B ... 
-1

できません。今はループのようなものです。インポートした場合は、もう一方をインポートします。

さらに、class A():class B():の後にスペースを追加する必要がありました。 あなたのコードは次のようになります。

ファイルA.py

from B import B 

class A(): 

    def __init__(self): 

     self.id = 5 

     self.b = B() 

ファイルB.py:

from A import A 

class B(): 

    def __init__(self): 

     self.id = 15 

     self.a = A() 
+0

空白が必要な場合はtrue、追加したら相互インポートが機能することは間違います。 –

+0

本当の問題を抱えている人を騙すべきではありません。 – Woody1193

+0

私は知らなかった...しないでくださいdownvote! –

0

インポート・ループと呼ばれているもの。修正する方法は、相互に依存するコードを両方とも参照するクラスCに移動することです。C.py

A.py

def class C: 

    def __init__(self): 
     # Do some stuff 

    # other methods 

B.py
from C import C 

def class A(C): 

    def __init__(self): 
     # Do some stuff in A 

    # other methods 

from C import C 

def class B(C): 

    def __init__(self): 
     # Do some stuff in B 

    # other methods 
関連する問題