4

次のプロジェクト構造を想像してみてください

app/
    foo/
        __init__.py
        a.py
        b.py

a.pyには、 b.pyファイルのクラスBを使用するクラスAがあり、 b.pyのBクラスはa.pyのAクラスを使用します。

私が書いた場合:

from foo.b import B 

a.pyと_

from foo.a import A

b.pyでは、再帰が発生します

ABを1つのファイルにマージせずに、適切にインポートするにはどうすればよいですか?

4

1 に答える 1

5

Pythonは循環インポートをサポートしていません。これは、通常、欠陥のある設計の兆候であるためです。

あなたができることは、作成AしてB自己完結し、3番目のファイルから両方を参照するか、あるいは、共有構造を3番目のファイルに抽出し、両方のモジュールからそれを参照することです。これがどの程度正確に機能するかは、何が何であるか、そしてなぜ彼らがお互いを知っているべきだと思うかによって大きく異なりAますB

たとえば、コンストラクタAを介してのインスタンスへの参照を作成するだけでB、インポートは不要になります。

class A(object):
    def __init__(self, b):
        self.b = b
    # .. some methods that reference self.b

継承が関係している場合は、もう少し複雑になります。その場合、置換原則に違反するため、スーパークラスにサブクラスを認識させたくない場合があります。

于 2012-09-24T20:54:44.453 に答える