31

言って、私はdispatch()に触れることによって、相互に重なって、次のミックスインがあります。私は私の見解は、順番を通過したい場合は、チェックミックスインの順序はどのように派生クラスに影響しますか?

class FooMixin(object): 
    def dispatch(self, *args, **kwargs): 
     # perform check A 
     ... 
     return super(FooMixin, self).dispatch(*args, **kwargs) 

class BarMixin(object): 
    def dispatch(self, *args, **kwargs): 
     # perform check B 
     ... 
     return super(FooMixin, self).dispatch(*args, **kwargs) 

を - > Bをチェックし、自分のコードがMyView(FooMixin, BarMixin, View)またはMyView(BarMixin, FooMixin, View)する必要があります?

なぜ私たちはいつもViewまたはそのサブクラスをミックスインの後に入れますか? (これは、ジャンゴ一般的なビューのソースコードを読むことから気づいたが、もしあれば、それの背後に根拠を知らない)

答えて

57

MROは、基本的に左から右の奥行きです。詳細については、Method Resolution Order (MRO) in new style Python classesを参照してください。

クラスの__mro__ attributeを確認することができますが、最初に "チェックA"を行う場合は、​​が最初になります。

class UltimateBase(object): 
    def dispatch(self, *args, **kwargs): 
     print 'base dispatch' 

class FooMixin(object): 
    def dispatch(self, *args, **kwargs): 
     print 'perform check A' 
     return super(FooMixin, self).dispatch(*args, **kwargs) 

class BarMixin(object): 
    def dispatch(self, *args, **kwargs): 
     print 'perform check B' 
     return super(BarMixin, self).dispatch(*args, **kwargs) 

class FooBar(FooMixin, BarMixin, UltimateBase): 
    pass 

FooBar().dispatch() 

プリント:

perform check A 
perform check B 
base dispatch 

Viewようにそれを「キャッチ」これらのミックスイン上の任意のメソッドを隠すことなく、任意のミックスインではありませんでした任意の属性検索を最後にする必要があります。私はあなたの質問の一部を理解しているのか分かりません - それはなぜ「それがすべて追加されたのですか」または「最後に追加されたのはなぜですか?

+1

thx agf。私の質問は「なぜ最後に追加されたのか」ということになっていて、あなたはそれに答えました。乾杯。 – tamakisquare

+1

これを直接呼び出す唯一の方法は 'FooMixin.dispatch'です。 'super(FooMixin、self).dispatch'は、' object'に 'dispatch'メソッドがないので' BarMixin.dispatch'に評価されます。 'super(BarMixin、self).dispatch'は同じ理由で' UltimateBase.dispatch'と評価されます。 –

+0

@MadPhysicistそうではありません。メソッドがオブジェクトによって定義されているメソッドであっても、これは動作します。自分で試してみてください。詳細については、リンクされた回答を参照してください。 – agf

関連する問題