私は現在、人口モデルシミュレーションのためのPython 2.7コードをいくつか書いています。私は、循環インポートの問題に遭遇しました。循環インポートを解決するためのソフトウェアアーキテクチャの変更方法は?
モデルは以下の構造を有する:(landscape.py
で)
Island
クラス座標
Cell
(landscape.py
で)クラス
-
と風景細胞の
- コレクション
- すべてのランドスケープセルのスーパークラス(
Jungle
、Savannah
、Mountain
など)。セルクラスには、このセル内の異なる動物の辞書があります。 animal
辞書は次のように構成されていますanimals = {AnimalType1: [animal1_inst_1, animal_2_inst_2], AnimalType2: [animal2_inst_1, animal_2_inst_2]}
は、各セルの初期
animal
辞書は、実行時に設定されています。- すべての動物の種類のスーパークラス(現在は
Herbivore
とCarnivore
)。 すべての動物クラスには、この動物が住むことができるすべての細胞型のリストである
allowed_cells
というクラス変数があります。allowed_cells = [landscape.Jungle, landscape.Savannah]
Animal
(animals.py
中)クラス
私の問題はこれです - animals.pyは、動物辞書内のすべてのキーがAnimal
サブクラスであるかどうかを確認するためにlandscape.pyにインポートされ、対応するリスト内のすべてのインスタンスは、その動物のクラスのインスタンスである場合。 animals.py
では、allowed_cells
リストが他の多くのテストに加えて実際のセルクラスを持つことができるようにlandscape.py
がインポートされます。
私は、コードを実行しようとすると、私はエラーを取得:
Traceback (most recent call last):
File "C:/Users/yngve_000/Documents/INF200/inf200_dag_yngve/PA04/biosim/simulation.py", line 10, in <module>
import landscape as landscape
File "C:\Users\yngve_000\Documents\INF200\inf200_dag_yngve\PA04\biosim\landscape.py", line 12, in <module>
import animals
File "C:\Users\yngve_000\Documents\INF200\inf200_dag_yngve\PA04\biosim\animals.py", line 18, in <module>
class Animal(object):
File "C:\Users\yngve_000\Documents\INF200\inf200_dag_yngve\PA04\biosim\animals.py", line 70, in Animal
allowed_cell_types = [landscape.Jungle, landscape.Desert,
AttributeError: 'module' object has no attribute 'Jungle'
私はこのエラーが発生する理由を理解ではなく、どのようにエレガントな方法でそれを削除します。 Animalクラスのis_animal関数を作成し、try/exceptを使用していくつかの回避策を使用することは可能ですが、それは最も控えめに言えば非常にぎこちないようです。
これにはどのような回避策がありますか?
あなたはそう言います*各セルの初期動物辞書は実行時*に設定されています。両方のモジュールがインポートされた場所にそのコードを移動するだけですか? –