[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