比如说,通过touch 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)

If I want my view to go through the order, check A -> check B, should my code be MyView(FooMixin, BarMixin, View) or MyView(BarMixin, FooMixin, View)?

为什么我们总是把View或它的子类放在mixin之后?(我在阅读django泛型视图的源代码时注意到了这一点,但我不知道背后的理由(如果有的话)

推荐答案

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必须是最后一个,这样它才能"捕获"任何不在任何混合上的属性查找,而不会隐藏这些混合上的任何方法.我不确定我是否理解你问题的这一部分--什么是"为什么要添加它"或者"为什么添加到最后"?

Django相关问答推荐

如何在管理页面创建实例时只在ManyToManyField字段中显示超级用户

在Python中向函数的查询列表添加条件

如何创建复杂的查询?| ChartJS 和 Django

在 Serverless + Lambda + API Gateway HTTP API 上运行的 Django 应用程序正在重写链接以使用默认前缀

如何在Django中制作一个不 Select 以前日期的日期 Select 器

Django 过滤器:过滤隐藏在多层模型 struct 中的对象

Django 模型命名约定

Django Rest Framework 中的 to_representation() 可以访问普通字段吗

Django 模板文件夹

Django:在模板中显示当前语言环境

将网络测功机添加到 Heroku django 应用程序时如何克服Coudn't find that formation错误?

magic有什么问题?

Django:在模型管理器中获取模型的表名?

Heroku - 在 Django 应用程序中处理静态文件

Django ModelChoiceField optgroup 标签

Django - 来自 QuerySet 的唯一列表

Django ALLOWED_HOSTS IP 范围

如何将本地文件分配给 Django 中的 FileField?

如何在 Python 中运行另一个脚本而不等待它完成?

Django: Force强制 Select 相关?