subtlywhen we say super selects the next class in the mrowe really mean the next class in the mro that implements the requested method--it technically skips ahead until it finds class with the requested name this matters for independent mix-in classeswhich might be added to arbitrary client trees without this skipping-ahead behaviorsuch mix-ins wouldn' work at all--they would otherwise drop the call chain of their clientsarbitrary methodsand couldn' rely on their own super calls to work as expected in the following independent branchesfor examplec' call to method is passed oneven though mixinthe next class in the instance' mrodoesn' define that method' name as long as method name sets are disjointthis just works--the call chains of each branch can exist independentlymix-ins work for disjoint method sets class adef other(self)print(' other'class mixin( )def other(self)print('mixin other')super(other(class bdef method(self)print(' method'class (mixinb)def method(self)print(' method')super(other()super(method( (method( method mixin other other method __mro__ (similarlymixing the other way doesn' break call chains of the mix-in either for instancein the followingeven though doesn' define other when called in cclasses do later in the mro in factthe call chains work even if one of the branches doesn' use super at all--as long as method is defined somewhere ahead on the mroits call worksclass (bmixin)def method(self)print(' method')super(other()super(method( (method( method mixin other other method __mro__ the super built-in functionfor better or worse