mixin的顺序如何影响派生类?

时间:2012-04-04 20:28:42

标签: python django django-views django-class-based-views method-resolution-order

说,我通过触摸dispatch()

让以下mixin相互重叠
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)

如果我希望我的观看完成订单,请检查A - >检查B,我的代码应该是MyView(FooMixin, BarMixin, View)还是MyView(BarMixin, FooMixin, View)

为什么我们总是在mixins之后放置View或其子类? (我从阅读django通用视图的源代码中注意到了这一点,但我不知道它背后的基本原理,如果有的话)

1 个答案:

答案 0 :(得分:69)

MRO基本上是深度优先,从左到右。有关详细信息,请参阅Method Resolution Order (MRO) in new style Python classes

您可以查看要检查的课程的__mro__ attribute,但如果您想先“检查A”,则FooMixin应该是第一位。

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必须是最后的,以便“捕获”任何不在任何mixins上的属性查找,而不会在这些mixin上隐藏任何方法。我不确定我是否理解你的问题的一部分 - 它是什么“为什么它会被添加”或“为什么它会被添加到最后”?