質問
私のアプリケーションでは、現在接続しているユーザー、回答の総数、アプリケーション構成ファイルの作成など、グローバルアプリケーションの状態とグローバルアプリケーション全体のメソッドを維持する必要があります。2つのオプションがあります。
-
グローバル変数とその上の関数を含む別個のappstate.pyファイルを作成します。最初は問題ないように見えますが、コードが明確に何かが欠けているようです。
-
appstate.pyファイルにクラス関数を持つクラスAppStateを作成します。他のすべてのモジュールは、特定のジョブによって定義されています。これは問題ありません。しかし、今はappstate.AppState.get_user_list()のような長い行を書かなければなりません。さらに、メソッドは互いにあまり関連していません。別のクラスを作成できますが、クラスが多すぎます。
編集:クラスを使用する場合、クラスメソッドを使用します。クラスをオブジェクトにインスタンス化する必要はないと思います。
解決
2番目のアプローチの方が良いようです。最初のものは設定ファイルなどにのみ使用します。
とにかく、あなたがいつもできる問題を避けるために:
from myapp.appstate import AppState
これにより、長い行を書く必要がなくなります。
他のヒント
古典的な難問のような音:-)。
Pythonでは、それが最良のアプローチである場合、モジュールを使用することを選択することについて汚いまたは恥ずべきことは何もありません。結局のところ、モジュール、関数などは実際には言語の第一級市民であり、他の多くのプログラミング言語がオブジェクトの使用によってのみ提供する内省とプロパティを提供します。
オプションの説明の仕方は、この場合のクラスベースのアプローチにあまり夢中になっていないように聞こえます。
Djangoフレームワークを使用したかどうかはわかりませんが、使用していない場合は、設定の処理方法に関するドキュメントを参照してください。これらはアプリ全体に適用され、モジュールで定義され、グローバルに利用可能です。オプションを解析してグローバルに公開する方法は非常に洗練されており、ニーズに刺激を与えるようなアプローチを見つけることができます。
2番目のアプローチは、AppStateのインスタンスにアプリケーションの状態が保存されている場合にのみ、最初のアプローチと大きく異なります。この場合、苦情は適用されません。ものをクラスに保存するだけで、静的/クラスメソッドを使用している場合、クラスはモジュールと変わらず、実際にモジュールとして使用するのはPythonicです。
なぜそのクラスのインスタンスを使用しないのですか?そうすれば、後で2つの異なる「セッション」を持つことができます。使用するインスタンスに応じて実行されます。それはより柔軟にするかもしれません。クラスにインスタンスを1回インスタンス化するために、モジュールにメソッド get_appstate()
を追加する場合があります。後で複数のインスタンスが必要になる場合は、このメソッドを変更して、最終的にパラメーターを取得し、辞書などを使用してそれらのインスタンスを保存できます。
プロパティデコレータbtwを使用して、物事をより読みやすくし、保存方法や場所を柔軟に保存することもできます。
classmethodsの代わりにモジュールアプローチを使用する方がよりPythonicになることに同意します。
ところで、私は「マジック」によって世界的に物事を手に入れることができるという大ファンではありません。むしろ、明示的な呼び出しを使用してその情報を取得したいと思います。それから、物事がどこから来て、物事が失敗したときにそれをデバッグする方法を知っています。
この例を検討してください:
configuration
|
+-> graphics
| |
| +-> 3D
| |
| +-> 2D
|
+-> sound
本当の質問は、この階層のクラスとモジュールの違いは何ですか?両方の手段で表すことができますか?
クラスは型を表します。モジュールの代わりにクラスを使用してソリューションを実装する場合、適切なタイプのグラフィックスオブジェクトをチェックできますが、一般的なグラフィックス関数を記述できます。
クラスを使用すると、パラメーター化された値を生成できます。これは、コンストラクターを使用して sounds クラスを異なる方法で初期化することが可能であることを意味しますが、異なるパラメーターを使用してモジュールを初期化することは困難です。
ポイントは、あなたがモデリングの観点とは本当に違うものであるということです。
コードをよりよく整理するため、クラスルートを使用します。読みやすくするためにこれを実行できることに注意してください:
from appstate import AppSate
私は間違いなく2番目のオプションに行きます:最初のオプションをすでに使用しているので、アプリケーションが進化し、より多くのモジュラー構造をサポートする必要があるため、リファクタリングを余儀なくされたため、複数の同時「構成」を処理する必要があります'。
2番目のアプローチは、IMOであり、より柔軟で将来性があります。コードの長い行を回避するには、 import appstate
の代わりに from appstate import AppState
を使用できます。