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