at least that' almost the full story as we've seenbuilt-ins don' follow these rules instances and classes may both be skipped for built-in operations onlyas special case that differs from normal or explicit name inheritance because this is context-specific divergenceit' easier to demonstrate in code than to weave into single algorithm in the followingstr is the built-in__str__ is its explicit name equivalentand the instance is skipped for the built-in onlyclass cinheritance special case # attr built-ins skip step def __str__(self)return('class' ( __str__()str( ('class''class'both from class if not in instance __str__ lambda'instancei __str__()str( ('instance''class'explicit=>instancebuilt-in=>classi attr attr attr asymmetric with normal or explicit names as we saw in metaclass py earlierthe same holds true for classesexplicit names start at the classbut built-ins start at the class' classwhich is its metaclassand defaults to typeclass (type)def __str__(self)return(' class'class ( )pass __str__( )str( (' class'""explicit=>superbuilt-in=>metaclassclass ( )def __str__(self)return(' class' __str__( )str(cexplicit=>classbuilt-in=>metaclass(' class'""class (metaclass= )def __str__(self)return(' class' __str__( )str(cbuilt-in=>user-defined metaclass (' class'' class'in factit can sometimes be nontrivial to know where name comes from in this modelsince all classes also inherit from object--including the default type metaclass in the following' explicit callc appears to get default __str__ from object instead of the metaclassper the first source of class inheritance (the class' own mro)by contrastthe built-in skips ahead to the metaclass as beforeinheritance and instance