我将尽量简要,因为这很容易变成一篇冗长的讲话:
ABC由于只在Python 2.6中引入,而Django开发人员有一套Python版本支持的路线图(1.2版仅取消了对2.3的支持),所以它们已经过时了。
至于继承自对象的混合类,它们会在多个方面降低可读性,也不太符合Pythonic的风格。 Django使用ModelBase
元类来处理Model
对象,该元类实际上会分析初始值定义的模型属性,并用字段、选项和其他属性填充Model._meta
。重复使用此框架可以对两种类型的模型进行重用。这还使得Django能够防止被继承模型覆盖抽象模型字段。
我可以想到更多原因,虽然它们都很小,但加起来使当前实现更符合Pythonic风格。但是,使用继承自对象的混合类本身并没有任何本质的错误。
其中一个原因是由于模型上定义字段的方式。
字段以声明方式指定,这是正常类将其视为类属性的方式。但是,当实际实例化类时,它们需要成为实例属性,以便每个实例可以为每个字段具有自己的值。这是通过元类来管理的。这在普通的抽象基类中无法实现。