モデルインスタンスが表示されるWebページに関係する「meta_keywords」や「slug」などのフィールドを両方に含むモデルがいくつかあるのか、それらのページのメタデータ要素を分割することが賢明かどうか疑問に思っていましたPageMeta などの独自のクラスに変換し、他のモデルに多重継承を介してそれらのサブクラスを持たせますか?
1 に答える
簡単に指定された質問に対する一般的なアドバイス:
Pythonでの自明でない多重継承には、メタクラス/メタタイプの競合に対処するための高度な手法が必要です。ActiveStateアーカイブからこのレシピを調べて、気に入ったもののように見えるかどうかを確認してください。
リンクされたレシピからの抜粋:
メタタイプの競合が発生する最も単純なケースは次のとおりです。
M_A
メタクラスを持つクラスAと独立したメタクラスを持つクラスBを考えてみましょうM_B
。AとBからCを導出するとします。問題は、Cのメタクラスは何ですか?それM_A
ですかM_B
?正解は(思慮深い議論については「メタクラスを機能させる」という本を参照)です
M_C
。ここ で、M_C
はとから継承するメタクラスです 。M_A
M_B
ただし、Pythonはそれほど魔法ではなく、自動的に作成されません
M_C
。代わりに、TypeErrorが発生し、混乱の可能性があることをプログラマーに警告します。
したがって、Pythonでの多重継承の使用を次の場合に制限することをお勧めします。
- 問題のドメインでは、別々に管理されている2つの単一継承ライブラリを組み合わせる必要があるためです。
- メタタイプとメタクラスで流暢に話せるようになったので、レシピ204197またはそれに相当するものを、印刷ステートメントを書くのと同じくらい簡単かつ自信を持って書くことができます。
編集:
Python入門のGuidovanRossumは次のとおりです。
偶発的な名前の競合を回避するためにPythonが規則に依存していることを考えると、多重継承の無差別な使用がメンテナンスの悪夢であることは明らかです。
ここでも彼はPEP253にいます。これは、Pythonに組み込まれたアイデアについて説明していますが、実装については説明していません。
メタタイプは、型が呼び出されたときに何が起こるか、動的型がどのようになっているのか(型のdictが作成後に変更できるかどうか)、メソッドの解決順序、インスタンス属性の検索方法など、型のさまざまなポリシーを決定します。すぐ。
多重継承を最大限に活用したい場合は、左から右への深さ優先が最善の解決策ではないことを主張します。
多重継承では、サブタイプのメタタイプはすべての基本タイプのメタタイプの子孫でなければならないことを主張します。
これは、多重継承を使用すべきではないという意味ではありません。警告しているので、いつの日か額を叩いて「D'oh!私のサブタイプの1つのメタタイプは、そのすべての基本タイプのメタタイプの子孫ではありません!」と叫んでも驚かないでしょう。それが起こったとき、あなたは嫌いではありませんか?」