60

说,我有以下通过触摸相互重叠的混合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)

如果我希望我的视图通过订单,请检查 A -> 检查 B,我的代码应该是MyView(FooMixin, BarMixin, View)还是MyView(BarMixin, FooMixin, View)

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

4

1 回答 1

97

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

您可以查看要检查的类的__mro__属性,但FooMixin如果您想先进行“检查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必须放在最后,这样它才能“捕获”任何不在任何 mixin 上的属性查找,而不在这些 mixin 上隐藏任何方法。我不确定我是否理解您问题的那一部分-“为什么要添加它”或“为什么要最后添加”?

于 2012-04-04T20:32:35.790 回答