一尘不染

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

django

说,我有以下mixin通过触摸彼此重叠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通用视图的源代码注意到了这一点,但我不知道其背后的原理,如果有的话)


阅读 348

收藏
2020-03-30

共1个答案

一尘不染

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()

Prints:

perform check A
perform check B
base dispatch

View必须是最后一个,这样它才能“捕获”任何未在任何mixin上进行的任何属性查找,而不会在这些mixin上隐藏任何方法。我不确定我是否理解你的问题的一部分-什么“为什么要添加”或“为什么最后添加”?

2020-03-30