说,我有以下通过触摸 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)
如果我希望我的 View 通过订单,请检查 A -> 检查 B,我的代码应该是 MyView(FooMixin, BarMixin, View)
还是 MyView(BarMixin, FooMixin,查看)
?
为什么我们总是把 View
或其子类放在 mixins 之后? (我在阅读 django 通用 View 的源代码时注意到了这一点,但我不知道其背后的原理,如果有的话)
最佳答案
MRO 基本上是深度优先,从左到右。见 Method Resolution Order (MRO) in new style Python classes了解更多信息。
您可以查看__mro__
attribute要检查的类,但如果您想先执行“检查 A”,则应该首先使用 FooMixin
。
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 上的任何方法。我不确定我是否理解您问题的那一部分——“为什么要添加它”或“为什么最后添加”?
关于python - mixin 的顺序如何影响派生类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10018757/