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 Aperform check B
base dispatch
View
必须是最后一个,这样它才能“捕获”任何未在任何mixin上进行的任何属性查找,而不会在这些mixin上隐藏任何方法。我不确定我是否理解你的问题的一部分-什么“为什么要添加”或“为什么最后添加”?
以上是 mixin的顺序如何影响派生类? 的全部内容, 来源链接: utcz.com/qa/399680.html