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

时间:2011-11-04 17:01:45

标签: python multiple-inheritance init super new-style-class

  

可能重复:
  Can Super deal with multiple inheritance?

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__()

3 个答案:

答案 0 :(得分:31)

super()的想法是,您无需单独调用两个超类“__init__()方法 - super()会照顾它,只要您正确使用它 - - 请参阅Raymond Hettinger's "Python’s super() considered super!"获取解释。

尽管如此,我经常发现构造函数调用的super()的缺点超过了优点。例如,所有构造函数都需要提供额外的**kwargs参数,所有类必须协作,非协作外部类需要包装器,您必须注意每个构造函数参数名称在 all <中是唯一的/ strong>你的课程等。

通常情况下,我认为显式命名要为构造函数调用调用的基类方法更容易:

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

我确实将super()用于具有保证原型的函数,例如__getattr__()。在这些情况下没有缺点。

答案 1 :(得分:21)

通过super调用并不会调用所有父项,它会调用MRO链中的下一个函数。为了使其正常工作,您需要在所有super中使用__init__

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__()

在Python 3中,您可以使用super()代替super(type, instance)

答案 2 :(得分: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)