1. ホーム
  2. python

[解決済み] Pythonで循環インポートを回避する方法は?[重複しています]。

2022-04-26 11:16:01

質問

Pythonにおける循環インポートの問題は、これまでにも何度も出てきていますし、私もこれらの議論を読んでいます。これらの議論の中で繰り返しなされるコメントは、循環インポートは悪い設計の兆候であり、循環インポートを避けるためにコードを再編成すべきであるということです。

このような場合、どうすれば循環インポートを回避できるか、どなたか教えていただけないでしょうか。2つのクラスがあり、それぞれのクラスにもう一方のクラスのインスタンスを取り、そのクラスのインスタンスを返すコンストラクタ(メソッド)を持たせたいと思っています。

具体的には、1つのクラスはミュータブルで、1つのクラスはイミュータブルです。イミュータブルクラスが必要なのは ハッシュ化、比較などのため。ミュータブルなクラスも何かするのに必要です。これはセットとフロジンセット、リストとタプルに似ている。

両方のクラス定義を同じモジュールに入れることもできるんだけど。他に何か提案はありますか?

おもちゃのような例ですが、リストという属性を持つクラスAとタプルという属性を持つクラスBがあるとします。そして、クラスAはクラスBのインスタンスを受け取り、クラスAのインスタンスを返すメソッドを持ち(タプルをリストに変換する)、同様にクラスBはクラスAのインスタンスを受け取り、クラスBのインスタンスを返すメソッドを持つ(リストをタプルに変換する)。

解決方法は?

モジュールをインポートするだけで、モジュールからインポートしないでください。

検討する a.py :

import b

class A:
    def bar(self):
        return b.B()

b.py :

import a

class B:
    def bar(self):
        return a.A()

これは全く問題なく動作します。