Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python mixin的顺序如何影响派生类?_Python_Django_Django Views_Django Class Based Views_Method Resolution Order - Fatal编程技术网

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