gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:31:33 31 4
gpt4 key购买 nike

说,我有以下通过触摸 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com