这是我another question提出的问题。
Django提供Abstract base classes功能(与Python中的ABC类不同?)因此可以创建一个可以继承的模型(Django的models.Model),但没有该模型具有实际功能数据库中的表。一个通过在Model的Meta类中设置'abstract'属性来触发此行为。
现在的问题是:为什么Django会这样解决?为什么需要这种特殊的'抽象基类'模型?为什么不通过继承对象类并将其与现有模型混合来制作模型mixin?或者这也可以通过Python ABCs的任务? (请注意,我对Python中的ABC类不太熟悉,我的无知可能会在这里显示)
答案 0 :(得分:13)
我会尝试相当简短,因为这很容易变成冗长的dia骂:
ABCs之所以外出是因为它们只是在Python 2.6中引入,而Django开发人员已经为Python版本支持制定了一套路线图(2.3支持仅在1.2中被删除)。
对于继承对象的mixins,它们在更多方面不仅仅是Pythonic,而不仅仅是降低可读性。 Django对ModelBase
个对象使用Model
元类,实际上在初始化时分析定义的模型属性,并使用字段Model._meta
选项和其他属性填充Meta
。为两种类型的模型重用该框架是有意义的。这也允许Django通过继承模型来防止抽象模型字段被覆盖。
我能想到的原因还有很多,所有这些都是他们自己的一小部分原因,但他们加起来使得当前的实现更加Pythonic。使用对象继承mixin没有任何内在错误。
答案 1 :(得分:7)
其中一个原因是因为在模型上定义字段的方式。
字段以声明方式指定,以普通类将其视为类属性的方式。然而,它们需要成为实际实例化类的实例属性,以便每个实例可以为每个字段拥有自己的值。这是通过元类管理的。这不适用于普通的抽象基类。