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__()
Invocation via
super
doesn't call all the parents, it calls the next function in the MRO chain. For this to work properly, you need to usesuper
in all of the__init__
s:In Python 3, you can use
super()
instead ofsuper(type, instance)
.You could just call them directly with
Parent.__init__(self)
: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:
I do use
super()
for functions that have a guaranteed prototype, like__getattr__()
, though. There are not disadvantages in these cases.