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