关于python:mixin的顺序如何影响派生类?

How does the order of mixins affect the derived class?

比如说,我有以下通过触摸dispatch()相互重叠的混合体:

1
2
3
4
5
6
7
8
9
10
11
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->check b,我的代码应该是MyView(FooMixin, BarMixin, View)还是MyView(BarMixin, FooMixin, View)

为什么我们总是把View或它的子类放在混合之后?(我在阅读Django通用视图的源代码时注意到了这一点,但我不知道其背后的原因(如果有的话)。


MRO基本上是深度优先,从左到右。有关更多信息,请参见新样式Python类中的方法解析顺序(MRO)。

您可以查看要检查的类的__mro__属性,但是如果您想先检查a,FooMixin应该是第一个。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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()

印刷品:

1
2
3
perform check A
perform check B
base dispatch

View必须是最后一个,这样它就可以"捕获"不在任何mixin上的任何属性查找,而不隐藏这些mixin上的任何方法。我不确定我是否理解你问题的那一部分——什么是"为什么要添加"或"为什么最后添加"?