python - generic - ¿Cómo afecta el orden de mixins a la clase derivada?
django login class based view (1)
El MRO es básicamente de profundidad, de izquierda a derecha. Ver Orden de resolución de método (MRO) en las nuevas clases de Python de estilo para más información.
Puedes ver el atributo __mro__
de la clase para verificar, pero FooMixin
debería ser el primero si quieres hacer primero "verificar A".
class UltimateBase(object):
def dispatch(self, *args, **kwargs):
print ''base dispatch''
class FooMixin(object):
def dispatch(self, *args, **kwargs):
print ''perform check A''
return super(FooMixin, self).dispatch(*args, **kwargs)
class BarMixin(object):
def dispatch(self, *args, **kwargs):
print ''perform check B''
return super(BarMixin, self).dispatch(*args, **kwargs)
class FooBar(FooMixin, BarMixin, UltimateBase):
pass
FooBar().dispatch()
Huellas dactilares:
perform check A
perform check B
base dispatch
View
debe ser la última para que "capture" cualquier búsqueda de atributos que no esté en ninguna mixins, sin ocultar ningún método en esas mixins. No estoy seguro de entender esa parte de su pregunta: ¿qué es "por qué se agrega en absoluto" o "por qué se agrega al final"?
Diga, tengo los siguientes mixins que se solapan tocando dispatch()
:
class FooMixin(object):
def dispatch(self, *args, **kwargs):
# perform check A
...
return super(FooMixin, self).dispatch(*args, **kwargs)
class BarMixin(object):
def dispatch(self, *args, **kwargs):
# perform check B
...
return super(FooMixin, self).dispatch(*args, **kwargs)
Si quiero que mi vista MyView(FooMixin, BarMixin, View)
el pedido, marque A -> marcar B, ¿debería mi código ser MyView(FooMixin, BarMixin, View)
o MyView(BarMixin, FooMixin, View)
?
¿Y por qué siempre ponemos View
o sus subclases después de mixins? (Me he dado cuenta de esto al leer el código fuente de las vistas genéricas de django, pero no conozco las razones que lo respaldan, si corresponde)