class ( )def (self)super( ( ( ( __bases__ ( , ( start out inheriting from can' hardcode class name here change superclass at runtimethis works (and shares behavior-morphing goals with other deep magicsuch as changing an instance' __class__)but seems rare in the extreme moreoverthere may be other ways to achieve the same effect--perhaps most simplycalling through the current superclass tuple' value indirectlyspecial code to be surebut only for very special case (and perhaps not any more special than implicit routing by mros)class ( )def (self) __bases__[ (selfi ( ( __bases__ ( , ( special code for special case same effectwithout super(given the preexisting alternativesthis case alone doesn' seem to justify superthough in more complex treesthe next rationale--based on the tree' mro order instead of physical superclass links--may apply here as well cooperative multiple inheritance method dispatch the second of the use cases listed earlier is the main rationale commonly given for superand also borrows from other programming languages (most notablydylan)where its use case may be more common than it is in typical python code it generally applies to diamond pattern multiple inheritance treesdiscussed earlier in this and allows for cooperative and conformant classes to route calls to same-named method coherently among multiple class implementations especially for constructorswhich have multiple implementations normallythis can simplify call routing protocol when used consistently in this modeeach super call selects the method from next class following it in the mro ordering of the class of the self subject of method call the mro was introduced earlierit' the path python follows for inheritance in new-style classes because the mro' linear ordering depends on which class self was made fromthe order of method dispatch orchestrated by super can vary per class treeand visits each class just once as long as all classes use super to dispatch advanced class topics