说,我有以下mixin通过触摸彼此重叠dispatch():
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)?
MyView(FooMixin, BarMixin, View)
MyView(BarMixin, FooMixin, View)
为什么我们总是将View其子类或子类放在mixins之后?(我通过阅读django通用视图的源代码注意到了这一点,但我不知道其背后的原理,如果有的话)
View
MRO基本上是深度优先,从左到右。有关更多信息,请参见新型Python类中的方法解析顺序(MRO)。
你可以查看要检查的类的__mro__属性,但是FooMixin如果要首先执行“检查A”,则应该放在第一位。
__mro__
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()
Prints:
perform check A perform check B base dispatch
View必须是最后一个,这样它才能“捕获”任何未在任何mixin上进行的任何属性查找,而不会在这些mixin上隐藏任何方法。我不确定我是否理解你的问题的一部分-什么“为什么要添加”或“为什么最后添加”?