2010-07-16 20 views
9

Esta es una pregunta provocada por another question de mi parte.Django Modelos abstractos versus Python simples mixins vs Python ABCs

Django proporciona Abstract base classes funcionalidad (que no son lo mismo que las clases ABC en Python?) Para que uno pueda hacer un Modelo (modelos de Django.Model) del que uno puede heredar, pero sin que el Modelo tenga una tabla real en el base de datos. Uno desencadena este comportamiento estableciendo el atributo 'abstracto' en la clase Meta del Modelo.

Ahora la pregunta: ¿por qué Django lo resuelve de esta manera? ¿Por qué la necesidad de este tipo especial de Modelo de 'clase base abstracta'? ¿Por qué no crear una mezcla de modelos simplemente heredando de la clase de objetos y mezclándolos con un modelo existente? ¿O podría esto también una tarea para Python ABCs? (Mente que no estoy muy familiarizado con las clases ABC en Python, mi ignorancia podría mostrar aquí)

Respuesta

11

voy a tratar de ser razonablemente breve, ya que esto puede convertirse fácilmente en una larga diatriba:

ABC son fuera porque solo se introdujeron en Python 2.6, y los desarrolladores de Django tienen una hoja de ruta establecida para el soporte de la versión de Python (el soporte 2.3 solo se eliminó en 1.2).

En cuanto a los mixins que heredan objetos, serían menos pitonicos en más formas que solo reducir la legibilidad. Django usa una metaclass ModelBase para objetos Model, que en realidad analiza las propiedades del modelo definidas en la inicialización y rellena Model._meta con los campos, las opciones Meta y otras propiedades. Tiene sentido reutilizar ese marco para ambos tipos de modelos. Esto también le permite a Django evitar que los modelos abstractos sean anulados heredando modelos.

Hay muchas más razones que puedo pensar, todas ellas de poca importancia en sí mismas, pero se suman para hacer que la implementación actual sea mucho más pitonica. Sin embargo, no hay nada intrínsecamente incorrecto en el uso de mixins que hereden objetos.

+0

(Marcando esto como la respuesta aceptada, aunque Daniel también es bueno, pero Aram se expandió un poco más en los bits arenosos) Estoy en lo correcto al entender que, al usar mixins que heredan objetos, podría declarar campos adicionales en el modelo? ¿Pero podría agregar métodos adicionales o anularlos? – hopla

+0

Sí, las mezclas de objetos heredadas pueden declarar campos y métodos adicionales. Puede anular los métodos asegurándose de que su combinación heredada de objetos sea lo primero en la lista de clases heredadas. Sin embargo, independientemente del orden, un mixin que hereda objetos no puede anular un campo (aunque no lo va a dejar de validar si intenta hacerlo). –

6

Una de las razones se debe a la forma en que se definen los campos en un modelo.

Los campos se especifican declarativamente, de forma que una clase normal trataría como atributos de clase. Sin embargo, deben convertirse en atributos de instancia para cuando la clase se haya instanciado realmente, de modo que cada instancia pueda tener su propio valor para cada campo. Esto se maneja a través de la metaclase. Esto no funcionaría con una clase base abstracta normal.