¿Cómo afecta el orden de los mixins a la clase derivada?

Por ejemplo, tengo los siguientes mixins que se superponen entre sí al tocar 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 pase por el pedido, marque A -> marque B, ¿debería ser mi código MyView(FooMixin, BarMixin, View) o MyView(BarMixin, FooMixin, View) ?

¿Y por qué siempre ponemos View o sus subclases después de los mixins? (He notado esto al leer el código fuente de las vistas genéricas de django, pero no conozco la razón detrás de esto, si las hay)

El MRO es básicamente primero en profundidad, de izquierda a derecha. Consulte Orden de resolución de métodos (MRO) en clases de Python de nuevo estilo para obtener más información.

Puede ver el atributo __mro__ de la clase para verificar, pero FooMixin debería ser el primero si quiere hacer primero la “verificación 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 “capte” cualquier búsqueda de atributos que no se encuentre en ningún mixins, sin ocultar ningún método en esos mixins. No estoy seguro de entender esa parte de su pregunta: ¿qué es “por qué se agregó en absoluto” o “por qué se agregó por último”?