使用super为多个父类调用init



可能重复:
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__()

super()的思想是,您不必麻烦分别调用两个超类的__init__()方法——如果您正确使用它,super()会处理它——有关解释,请参阅Raymond Hettinger的"Python的super((被认为是super!"。

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

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

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

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

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

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

在Python3中,可以使用super()而不是super(type, instance)

您可以直接用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)

最新更新