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

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

回答:

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上隐藏任何方法。我不确定我是否理解你的问题的一部分-什么“为什么要添加”或“为什么最后添加”?

以上是 mixin的顺序如何影响派生类? 的全部内容, 来源链接: utcz.com/qa/399680.html

回到顶部