ホームページ  >  記事  >  バックエンド開発  >  不変クラスと可変クラスを使用して Python で循環インポートを処理する方法は?

不変クラスと可変クラスを使用して Python で循環インポートを処理する方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-06 20:26:02923ブラウズ

How to Handle Circular Imports in Python with Immutable and Mutable Classes?

不変クラスと可変クラスを使用した Python での循環インポートの回避

循環インポートは通常、不適切なコード設計の症状であると考えられます。ただし、特定のシナリオでは、クラス間の循環依存関係が必要になる場合があります。このような場合のインポート エラーを回避するには、インポート ステートメントと循環参照の配置を注意深く管理する必要があります。

シナリオ例

2 つのクラス A と B について考えます。ここで、A は可変属性 (リスト) を持ち、B は不変属性 (タプル) を持ちます。各クラスには、他のクラスのインスタンスを取得し、それ自体のインスタンスを返し、それに応じて属性を変換するメソッドが必要です。

解決策

回避すべきアプローチがいくつかあります。このシナリオでの循環インポート:

絶対インポート:

a.py と b.py では、モジュールが相互に直接インポートできるように絶対インポートを使用します:

# a.py
from package import b

# b.py
from package import a

インポートの延期:

関数内で実際に必要になるまで他のクラスのインポートを遅らせます:

# a.py
def convert_to_list(b_obj):
    from package import b
    return a.A(list(b_obj.immutable_attr))

# b.py
def convert_to_tuple(a_obj):
    from package import a
    return b.B(tuple(a_obj.mutable_attr))

中間モジュール:

a と b の両方をインポートする中間モジュールを作成します。このモジュールは、循環インポートを避けるために a と b の両方でインポートできます:

# package/common.py
import a
import b

a.py と b.py で、中間モジュールをインポートします:

# a.py
from package import common

# b.py
from package import common

クラス定義での循環参照の回避:

クラス定義での循環参照は回避する必要があります。代わりに、クラスの属性を引数として受け取り、適切なクラスのインスタンスを返すファクトリ関数を作成することを検討してください:

# a.py
def create_a(list_attr):
    return A(list(list_attr))

# b.py
def create_b(tuple_attr):
    return B(tuple(tuple_attr))

以上が不変クラスと可変クラスを使用して Python で循環インポートを処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。