这是
another question从我提示的一个问题.
Django提供Abstract base classes功能(与Python中的ABC类不同),以便可以创建一个可以继承的Model(Django的models.Model),但没有该Model在数据库中具有实际的表.通过在Model的Meta类中设置’abstract’属性来触发此行为.
现在的问题:Django为什么这样解决?为什么需要这种特殊的“抽象基类”模型?为什么不通过从对象类继承并将其与现有模型进行混合来使模型混合?或者也可以通过Python ABC的任务? (记住我对Python中的ABC类不太熟悉,我的无知可能在这里显示)
解决方法
我会尽量相当简短,因为这可以很容易变成一个冗长的讽刺:
ABC出来是因为它们仅在Python 2.6中引入,Django开发人员有一个Python版本支持的路线图(2.3支持仅在1.2中下降).
对于对象继承的混合物,它们在减少可读性方面不如Pythonic更多,而不仅仅是降低可读性. Django将ModelBase元类用于Model对象,该对象实际上分析了初始化时定义的模型属性,并使用字段Meta选项和其他属性填充了Model._Meta.对于两种类型的模型重用该框架是有意义的.这也允许Django通过继承模型来防止抽象模型字段被覆盖.
还有更多的理由我可以想到,所有这些都是在自己中的,但它们相加使得当前的实现更加Pythonic.尽管使用对象继承的mixin并没有什么内在的错误.