class (mixinb)def method(self)print(' method')mixin other(self) method(selfx ( method( method mixin other other method more cruciallythis example so far assumes that method names are disjoint in its branchesthe dispatch order for same-named methods in diamonds like this may be much less fortuitous in diamond like the precedingfor exampleit' not impossible that client class could invalidate super call' intent--the call to method in mixin in the following works to run ' version as expectedunless it' mixed into tree that drops the call chainbut for nondisjoint methodssuper creates overly strong coupling class adef method(self)print(' method'class mixin( )def method(self)print('mixin method')super(method(mixin(method(mixin method method class ( )def method(self)print(' method'super here would invoke after class (mixinb)def method(self)print(' method')super(method( (method( method mixin method method we miss in this context onlyit may be that shouldn' redefine this method anyhow (and franklywe may be encroaching on problems inherent in multiple inheritance in general)but this need not also break the mix-in--direct calls give you more control in such casesand allow mixin classes to be much more independent of usage contextsand direct calls do notthey are immune to context of use class adef method(self)print(' method'class mixin( )def method(self)print('mixin method') method(selfc irrelevant class (mixinb)def method(self)print(' method')mixin method(selfc(method( method the super built-in functionfor better or worse