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

标签 python django django-views django-class-based-views method-resolution-order

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

相关文章:

python - 减少 Dart 中包装对象的数量

python - 如何用日期时间字符串减去 datetime.now 对象?

python - 动态使用try异常的问题

python - django 通过 Node 服务器和 socket.io 将消息保存到数据库

Django UnicodeDecodeError 和 force_unicode

css - 无法将背景图像添加到 Django 站点中的 div

django - 如何查询多对多字段中仅描述的对象存在的位置

python - 使用 scipy 的 SmoothSphereBivariateSpline 进行插值

jquery - 更改 AJAX 调用的 url

python - 删除前编辑记录。 Django 删除 View