3

Python アプリの MVC パターンのモデル部分でクラスを構造化する際に問題があります。どのように物事を変えても、循環インポートに遭遇し続けます。ここに私が持っているものがあります:

モデル/__init__p.y

  • すべてのモデルクラス名を保持する必要があるため、コントローラーまたはユニットテストケースなどから「モデルインポートユーザーから」実行できます

モデル/データベース.py

  • データベースクラスを保持
  • ORMを行うには、すべてのモデルクラスをインポートする必要があります
  • 初期化は最初のモジュールのインポート時に実行する必要があります。つまり、余分な init 呼び出しやインスタンス化はありません (データベース クラスのすべてのメソッドは @classmethods です)。

モデル/User.py

  • User モデル クラスを含む
  • クエリを実行するには、データベース クラスにアクセスする必要があります
  • 機能を共有するために、すべてのモデル クラスに共通の基本クラスから継承する必要があります (データベース永続化メソッド、パラメーター検証コードなど)。

私はまだ MVC を採用している実際の Python アプリを見たことがないので、私のアプローチはおそらく非 Pythonic です (そしておそらく言語にとらわれない混乱です...) - これを解決する方法について何か提案はありますか?

ありがとう、サイモン

4

3 に答える 3

7

仕様に矛盾があります。Database.py は ORM を実行するためにすべての Model クラスをインポートする必要があると言いますが、User クラスはクエリを実行するためにデータベースにアクセスする必要があると言います。

これらを API のレイヤーと考えてください。Database クラスは、いくつかの物理永続層 (DB-API 2.0 など) に API (おそらくオブジェクト指向) を提供します。User などの Model クラスは、データベース層を使用して状態をロードおよび保存します。Database.py クラスがすべての Model クラスをインポートする理由はありません。実際、新しい Model クラスを作成するたびに Database.py を変更する必要があるため、これは不要です。これはコードの匂いです。 .

于 2008-10-09T02:22:03.623 に答える
3

通常、すべてを 1 つのファイルにまとめます。これは Java や C++ ではありません。

Python の経験を積むまでは、1 つのファイルから始めてください。ファイルが巨大でない限り、問題なく動作します。

たとえば、Django はこのスタイルを推奨しているので、成功の公式をコピーしてください。モデル用の 1 つのモジュール。各アプリケーションのモジュール。各アプリケーションは共通のモデルをインポートします。

__init__.pyパッケージ全体に適用されるため、データベースとスーパークラスのものをファイルに含めることができます。これにより、循環性の一部が低下する可能性があります。

于 2008-10-08T23:55:10.597 に答える
1

私はあなたが正さなければならない 1 つの問題を持っていると思います。循環参照は、多くの場合、懸念事項の分離を達成できなかったために発生します。私の意見では、データベース モジュールとモデル モジュールは互いのことをあまり知らず、代わりに API に対して動作するべきです。この場合、データベースは特定のモデル クラスを直接参照するのではなく、モデル クラスが機能するために必要な機能を提供する必要があります。次に、モデルはデータベース参照 (注入または要求) を取得し、それを使用してそれ自体をクエリおよび永続化する必要があります。

于 2008-10-09T00:28:18.767 に答える