当前位置: 首页 > 面试题库 >

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

乐成济
2023-03-14
问题内容

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



 类似资料:
  • 我对一个< code>select有一些奇怪的问题。< code>WHERE子句中的顺序可能会影响结果吗? 这是我的选择: 这将重现这个结果:http://dl.dropbox.com/u/4892450/sqlSelectProblem/select1.PNG 当我使用这个条件时: (不同的顺序) 我得到一个不同的结果(参见 列): http://dl.dropbox.com/u/4892450

  • 我的印象是,在完成时放入的任何内容都发生在与生成它的线程完全分离的线程上。但今天我们遇到了一个事件,从我们的日志中可以看出,当完成时,似乎从

  • 我知道线程是并发运行的,所以您无法预测执行的顺序,但在提供的代码中,我在运行其他代码之前加入了thread。如果应该等到线程执行完毕,那么为什么顺序仍然是随机的呢?在两个print语句之前加入任何内容总是会导致它们最后被打印,而如果我在之后加入所有内容,它并不总是最后,为什么?

  • 问题内容: 我知道CSS选择器具有最高的优先级(即< )。 我还知道,如果事物具有相同的特异性,那么最后一个调用的语句将具有优先权: HTML类在DOM元素上的排序是否会影响语句优先级? 问题答案: 我不得不不同意乔恩和沃森的回答,因为… 是的, 可以 (取决于声明) 您的问题是: CSS类在DOM元素上的排序是否会影响语句优先级? 哪个确实取决于所讨论的语句。 HTML排序通常不重要 当直接调用

  • 问题内容: 在对bat Logic-2进行编码时,我在下面列出的第一个方法中输入了loneSum问题。对于所有测试,只有一个测试是正确的。它唯一失败的是所有变量都等于同一整数。但是,当我在线查找解决方案时,得到了下面列出的第二种方法,并且该方法行得通。我认为我的方法和正确的解决方案之间的唯一区别是“ else if(a == b && b == c){return 0;}”的位置。我的问题是条件的

  • 问题内容: 在对bat Logic-2进行编码时,我在下面列出的第一个方法中输入了loneSum问题。对于所有测试,只有一个测试是正确的。它唯一失败的是所有变量都等于同一整数。但是,当我在线查找解决方案时,得到了下面列出的第二种方法,并且该方法行得通。我认为我的方法和正确的解决方案之间的唯一区别是“ else if(a == b && b == c){return 0;}”的位置。我的问题是条件的