Django抽象模型与简单Python混合模型与Python ABC

Django抽象模型与简单Python混合模型与Python ABC,python,django,Python,Django,这是我提出的一个问题 Django提供了一些功能(与Python中的ABC类不同?),这样可以创建一个模型(Django的models.Model),从中可以继承,但该模型在数据库中没有实际的表。可以通过在模型的元类中设置“abstract”属性来触发此行为 现在的问题是:Django为什么用这种方式解决这个问题?为什么需要这种特殊的“抽象基类”模型?为什么不通过从对象类继承并将其与现有模型混合来创建模型混合?或者这也可以通过Python ABCs的任务实现?(请注意,我对Python中的ABC

这是我提出的一个问题

Django提供了一些功能(与Python中的ABC类不同?),这样可以创建一个模型(Django的models.Model),从中可以继承,但该模型在数据库中没有实际的表。可以通过在模型的元类中设置“abstract”属性来触发此行为


现在的问题是:Django为什么用这种方式解决这个问题?为什么需要这种特殊的“抽象基类”模型?为什么不通过从对象类继承并将其与现有模型混合来创建模型混合?或者这也可以通过Python ABCs的任务实现?(请注意,我对Python中的ABC类不是很熟悉,我的无知可能会在这里表现出来)

我会尽量简短,因为这很容易变成一个冗长的批评:

ABC被淘汰是因为它们只在Python2.6中引入,Django开发人员有一套Python版本支持的路线图(2.3支持在1.2中才被放弃)

至于对象继承mixin,它们在很多方面都不如Pythonic,而不仅仅是降低可读性。Django为
Model
对象使用
ModelBase
元类,它在初始化时实际分析定义的模型属性,并使用字段、
meta
选项和其他属性填充
Model.\u meta
。对于这两种类型的模型,重用该框架是有意义的。这还允许Django防止抽象模型字段被继承模型覆盖


我可以想出更多的理由,所有这些都是次要的,但它们加起来使当前的实现更具python风格。不过,使用对象继承mixin本身并没有什么问题。

原因之一是在模型上定义字段的方式


字段是以声明方式指定的,以一种普通类将其视为类属性的方式。然而,它们需要成为类实际实例化时的实例属性,以便每个实例对每个字段都有自己的值。这是通过元类管理的。这不适用于普通的抽象基类。

(将此标记为可接受的答案,尽管Daniel的答案也不错,但Aram在细节部分进行了更多扩展。)我的理解正确吗,通过使用对象继承mixin,我可以在模型上声明额外的字段?但是我可以添加额外的方法或者重写它们吗?是的,继承mixin的对象可以声明额外的字段和方法。通过确保继承mix-in的对象在要继承的类列表中位于第一位,可以重写方法。但是,无论顺序如何,继承mixin的对象都无法重写字段(如果尝试重写,则不会失败验证)。