Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

calling init for multiple parent classes with super? [duplicate]

Tags:

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__()
like image 420
scruffyDog Avatar asked Nov 04 '11 17:11

scruffyDog


People also ask

What does super () __ Init__ do?

Understanding Python super() with __init__() methods It is known as a constructor in Object-Oriented terminology. This method when called, allows the class to initialize the attributes of the class. The super() function allows us to avoid using the base class name explicitly.

Can we use super in multiple inheritance in Python?

In fact, multiple inheritance is the only case where super() is of any use. I would not recommend using it with classes using linear inheritance, where it's just useless overhead.

Can a class inherit from multiple super classes?

So what is multiple inheritance? In multiple inheritance, a class inherits from two or more super classes. It inherits the methods and variables from all super classes. If you create an object, it has all methods and variables from the classes.

Can you have multiple parent classes in Python?

Python supports multiple inheritance, where a class can have multiple parent classes.


2 Answers

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.

like image 175
Sven Marnach Avatar answered Sep 22 '22 06:09

Sven Marnach


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 use super in all of the __init__s:

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

class Parent2(object):
    def __init__(self):
        super(Parent2, self).__init__()
        self.var2 = 2

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

In Python 3, you can use super() instead of super(type, instance).

like image 30
Cat Plus Plus Avatar answered Sep 19 '22 06:09

Cat Plus Plus