[Python-Dev] Things to Know About Super

Joel Bender jjb5 at cornell.edu
Thu Aug 28 20:36:00 CEST 2008


Greg,


> Do you have a real-life example of this where multiple
> inheritance is actually used?

I have built a framework that I have called the "capability pattern" 
which uses multiple inheritance in a way that might be unique (I'm not 
familiar enough with other frameworks to know for sure).

There are two classes, a Collector and a Capability.  The result of 
calling a function of the collector is a list of results of calling the 
functions of the bound capabilities.  For example, these three are 
capability classes:

     class X(Capability):
         def f(self): return 'X.f'

     class Y(Capability):
         def g(self): return 'Y.g'

     class Z(Capability):
         def f(self): return 'Z.f'
         def g(self): return 'Z.g'

Now to create a sample collector:

     class A(Collector, X, Y, Z): pass

Calling A().f() returns ['X.f', 'Z.f'].

I use this pattern in a web application.  The do_GET call is mapped into 
do_SHOW, and each 'capability' can return something from its do_SHOW 
(usually a <div> element) and the results are sent back to the user.  In 
my case I have lots of combinations of capabilities that can be mixed 
together.

I decided to use multiple inheritance over other patterns because I 
wanted to leverage isinstance(obj,Y) to indicate that some object has 
some capability, and not having to duplicate the method resolution order 
code for other kinds of methods is really nice.

> A non-contrived example or two would be a good thing to
> have in tutorials etc. where super() is discussed. It
> would help to convey the kinds of situations in which
> use of super() is and is not appropriate.

So this is a collection of cooperative classes, and super() isn't used.


Joel



More information about the Python-Dev mailing list