Python mixin的顺序如何影响派生类?
比如说,通过触摸Python mixin的顺序如何影响派生类?,python,django,django-views,django-class-based-views,method-resolution-order,Python,Django,Django Views,Django Class Based Views,Method Resolution Order,比如说,通过触摸dispatch(),我有以下相互重叠的混音: 如果我想查看订单,请选中A->选中B,我的代码应该是MyView(FooMixin,BarMixin,view)还是MyView(BarMixin,FooMixin,view) 为什么我们总是在mixin之后放置视图或其子类?(我在阅读django通用视图的源代码时注意到了这一点,但我不知道它背后的原理(如果有的话)MRO基本上是从左到右的深度优先。有关更多信息,请参阅 您可以查看要检查的类的名称,但是如果您想先执行“checka”
dispatch()
,我有以下相互重叠的混音:
如果我想查看订单,请选中A->选中B,我的代码应该是MyView(FooMixin,BarMixin,view)
还是MyView(BarMixin,FooMixin,view)
为什么我们总是在mixin之后放置
视图
或其子类?(我在阅读django通用视图的源代码时注意到了这一点,但我不知道它背后的原理(如果有的话)MRO基本上是从左到右的深度优先。有关更多信息,请参阅
您可以查看要检查的类的名称,但是如果您想先执行“checka”,则应首先执行FooMixin
印刷品:
perform check A
perform check B
base dispatch
视图
必须是最后一个,以便它“捕获”不在任何mixin上的任何属性查找,而不隐藏这些mixin上的任何方法。我不确定我是否理解你问题的那一部分——它是什么“为什么添加”还是“为什么最后添加”?thx agf。我的问题是“为什么要添加到最后一个”,你已经回答了。干杯。我要说的是,它直接调用的唯一方法是FooMixin.dispatch
super(FooMixin,self).dispatch
然后计算为BarMixin.dispatch
,因为object
没有dispatch
方法super(BarMixin,self)。dispatch
计算为UltimateBase.dispatch
,原因与此相同。@MadPhysician,这不太正确。即使该方法也是由object定义的,也可以这样做——您自己试试。有关详细信息,请参阅链接答案。@agf。当然我的错误<代码>对象的分派将在最后调用。我的陈述本应该是一个问题,但我分心了,忘了把它说清楚。谢谢你的回答:)
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