使用super调用多个父类的init?

scr*_*Dog 14 python init multiple-inheritance super new-style-class

可能重复:
Super可以处理多重继承吗?

Python继承?我有一个类结构(下面),并希望子类调用__init__父双方.这可能是以"超级"方式做的还是只是一个可怕的想法?

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__()
Run Code Online (Sandbox Code Playgroud)

Sve*_*ach 33

这个想法super()是你不必__init__()单独调用两个超类的方法 - super()只要你正确使用它就会照顾它 - 请参阅Raymond Hettinger的"Python的超级()被认为超级!" 作出解释.

也就是说,我经常发现super()构造函数调用的缺点超过了优点.例如,所有构造函数都需要提供一个额外的**kwargs参数,所有类必须协作,非协作外部类需要一个包装器,您必须注意每个构造函数参数名称在所有类中都是唯一的,等等.

因此,我认为通过显式命名要为构造函数调用调用的基类方法更容易:

class Child(Parent1, Parent2):
    def __init__(self):
        Parent1.__init__(self)
        Parent2.__init__(self)
Run Code Online (Sandbox Code Playgroud)

我确实使用super()具有保证原型的函数__getattr__().在这些情况下没有缺点.


Cat*_*lus 22

Invocation via super不会调用所有父项,它调用MRO链中的下一个函数.为了使其正常工作,您需要super在所有__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__()
Run Code Online (Sandbox Code Playgroud)

在Python 3中,您可以使用super()而不是super(type, instance).


cho*_*own 9

您可以直接用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)
Run Code Online (Sandbox Code Playgroud)