[Python-Dev] Things to Know About Super

Phillip J. Eby pje at telecommunity.com
Wed Aug 27 05:15:36 CEST 2008


At 03:16 AM 8/27/2008 +0200, Michele Simionato wrote:
>It is just a matter of how rare the use cases really are. Cooperative
>methods has been introduced 6+ years ago. In all this time surely
>they must have been used. How many compelling uses of cooperation
>we can find in real life code? For instance in the standard library or
>in some well known framework? This is a serious question I have been
>wanting to ask for years. I am sure people here can find some example,
>so just give me a pointer and we will see.

ISTR pointing out on more than one occasion that a major use case for 
co-operative super() is in the implementation of metaclasses.  The 
__init__ and __new__ signatures are fixed, multiple inheritance is 
possible, and co-operativeness is a must (as the base class methods 
*must* be called).  I'm hard-pressed to think of a metaclass 
constructor or initializer that I've written in the last half-decade 
or more where I didn't use super() to make it co-operative.

That, IMO, is a compelling use case even if there were not a single 
other example of the need for super.  However, I'm pretty sure I've 
had other cases where it was necessary to co-operate in cases where 
multiple inheritance occurred later; ie. where it was possible for a 
subclass to add a new class between parents.  Remember that 
subclasses of a new-style class do not always have the same MRO tail 
as the original class; i.e., a subclass of "class A(B, C):" is only 
constrained to have [A...B...C] in its MRO; semi-arbitrary classes 
may be inserted between e.g. A and B.  So, a new-style class cannot, 
as a general rule, statically determine what base class 
implementation of a method should be invoked.  I personally consider 
the rare case where I have to force such static knowledge to be an 
unfortunate wart in the design (of that code, not Python).



More information about the Python-Dev mailing list