calling init for multiple parent classes with super?

scruffyDog picture scruffyDog · Nov 4, 2011 · Viewed 16.9k times · Source

Possible Duplicate:
Can Super deal with multiple inheritance?

Python inheritance? I have a class structure (below), and want the child class to call the __init__ of both parents. Is this possible to do in a 'super' way or is it just a terrible idea?

class Parent1(object):
    def __init__(self):
        self.var1 = 1

class Parent2(object):
    def _init__(self):
        self.var2 = 2

class Child(Parent1, Parent2):
    def __init__(self):
        ## call __init__ of Parent1
        ## call __init__ of Parent2
        ## super(Child, self).__init__()

Answer

Sven Marnach picture Sven Marnach · Nov 4, 2011

The idea of super() is that you don't have to bother calling both superclasses' __init__() methods separately -- super() will take care of it, provided you use it correctly -- see Raymond Hettinger's "Python’s super() considered super!" for an explanation.

That said, I often find the disadvantages of super() for constructor calls outweighing the advantages. For example, all your constructors need to provide an additional **kwargs argument, all classes must collaborate, non-collaborating external classes need a wrapper, you have to take care that each constructor parameter name is unique across all your classes, etc.

So more often than not, I think it is easier to explicitly name the base class methods you want to call for constructor calls:

class Child(Parent1, Parent2):
    def __init__(self):
        Parent1.__init__(self)
        Parent2.__init__(self)

I do use super() for functions that have a guaranteed prototype, like __getattr__(), though. There are not disadvantages in these cases.