这是another question提示的问题来 self 。
Django 提供 Abstract base classes功能(这与 Python 中的 ABC 类不同?),以便可以创建一个可以从中继承的模型(Django 的 models.Model),但该模型在数据库中没有实际的表。通过在模型的元类中设置“抽象”属性来触发此行为。
现在问题来了:Django 为什么要这样解决?为什么需要这种特殊的“抽象基类”模型?为什么不通过继承对象类并将其与现有模型混合来创建模型混合?或者这也可以通过 Python ABC 的任务来实现吗? (请注意,我对 Python 中的 ABC 类不是很熟悉,我的无知可能会在这里表现出来)
最佳答案
我会尽量简短,因为这很容易变成冗长的谩骂:
ABCs 已经出来了,因为它们只在 Python 2.6 中引入,Django 开发人员有一个 Python 版本支持的路线图(2.3 支持只在 1.2 中被删除)。
至于对象继承的 mixin,它们在很多方面都不像 Pythonic,而不仅仅是降低可读性。 Django 为 Model
对象使用 ModelBase
元类,它实际上在初始化时分析定义的模型属性,并使用字段填充 Model._meta
,Meta
选项和其他属性。为两种类型的模型重用该框架是有意义的。这也允许 Django 防止抽象模型字段被继承模型覆盖。
还有很多我能想到的原因,它们本身都是次要的,但它们加起来使当前的实现更加 Pythonic。不过,使用对象继承混入本身并没有错。
关于python - Django 抽象模型与简单的 Python 混合与 Python ABCs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3263417/