A、A1、A2の3つのクラスを含む単一のPythonモジュールがあります。A1とA2はAから派生しています。AにはA1とA2を操作する関数が含まれています。
これは、1つの.pyファイルにある場合はすべて正常に機能します。しかし、そのファイルはかなり長くなっているので、A1とA2をそれぞれのファイルに分割したいと思います。循環依存にもかかわらず、このファイルを分割するにはどうすればよいですか?
A、A1、A2の3つのクラスを含む単一のPythonモジュールがあります。A1とA2はAから派生しています。AにはA1とA2を操作する関数が含まれています。
これは、1つの.pyファイルにある場合はすべて正常に機能します。しかし、そのファイルはかなり長くなっているので、A1とA2をそれぞれのファイルに分割したいと思います。循環依存にもかかわらず、このファイルを分割するにはどうすればよいですか?
modA.py:
class A(...):
...
modA1.py:
import modA
class A1(modA.A):
...
modA2.py:
import modA
class A2(modA.A):
...
modfull:
from modA import A
from modA1 import A1
from modA2 import A2
AがA1とA2を「処理」する場合でも、ダックタイピングのおかげで実際の名前をインポートする必要がないため、問題はありません。
循環依存にもかかわらず、このファイルを分割するにはどうすればよいですか?
オプション1:サイクルを中断する:基本クラスを独自のモジュールに配置し、派生クラスを追加のモジュールに配置し、それらの派生クラスを操作する関数をさらに別のモジュールに配置します。
オプション2:サイクルを無視し、モジュール/パッケージのみをグローバル名前空間IEにインポートします。
class Bar:
"Frobs Quuxen"
としてインポートしないでください。必要に応じて関数でfrom foo import Bar
使用import foo
および参照してください。foo.Bar
あなたの質問の核心はあなたが望まないということだと思います
a.py to imports a1
if
a1.py imports a.
ただし、Pythonではそれでまったく問題ありません。ただし、複数のモジュールを備えたシステムの関数/クラスの外部にコードがないことを確認してください。実行される順序は、インポートする場所、インポートするもの、月の満ち欠けによって異なるためです。 、など。