How does the order of mixins affect the derived class?

The MRO is basically depth-first, left-to-right. See Method Resolution Order (MRO) in new style Python classes for some more info.

You can look at the __mro__ attribute of the class to check, but FooMixin should be first if you want to do “check A” first.

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()

Prints:

perform check A
perform check B
base dispatch

View has to be last so that it “catches” any attribute lookups that weren’t on any mixins, without hiding any methods on those mixins. I’m not sure I understand that part of your question — what it “why is it added at all” or “why is it added last”?

Leave a Comment