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

馋奶兔 提交于 2019-12-03 10:37:36

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).

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.

chown

You could just call them directly with Parent.__init__(self):

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):
        Parent1.__init__(self)
        Parent2.__init__(self)
        print(self.var1, self.var2)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!