如何调用超级构造函数?

class A: def __init__(self): print "world" class B(A): def __init__(self): print "hello" B() hello 

在所有其他语言中,我使用超级构造函数是隐式调用的。 如何在Python中调用它? 我期望super(self)但这是行不通的。

super() 在新风格的类中返回父类对象:

 class A(object): def __init__(self): print "world" class B(A): def __init__(self): print "hello" super(B, self).__init__() B() 

与其他答案一致,有多种方法可以调用超类方法(包括构造函数),但是在Python-3.x中,这个过程被简化了:

Python的2.X

 class A(object): def __init__(self): print "world" class B(A): def __init__(self): print "hello" super(B, self).__init__() 

Python的3.X

 class A(object): def __init__(self): print("world") class B(A): def __init__(self): print("hello") super().__init__() 

super()现在相当于super(<containing classname>, self)按照文档 。

使用Python 2.x老风格的类将会是这样的:

 class A: def __init__(self): print "world" class B(A): def __init__(self): print "hello" A.__init__(self) 

一种方法是调用A的构造函数并将self作为parameter passing,如下所示:

 class B(A): def __init__(self): A.__init__(self) print "hello" 

这种风格的优势在于它非常清晰。 它调用A的构造函数。 缺点是它不能很好地处理菱形的inheritance,因为你最终可能会调用共享基类的构造函数两次。

另一种方法是使用super(),正如其他人所示。 对于单inheritance来说,它和让你调用父类的构造函数基本相同。

然而,super()在内部是相当复杂的,有时在多inheritance的情况下可能是违反直觉的。 另外,super()可以用来处理菱形的inheritance。 如果你想知道super()所做的事情,我已经find了超级()作品的最佳解释(虽然我不一定赞同这篇文章的观点)。

我使用以下公式来扩展以前的答案:

 class A(object): def __init__(self): print "world" class B(A): def __init__(self): print "hello" super(self.__class__, self).__init__() B() 

这样你就不必在呼叫super中重复类的名字了。 如果你编码了大量的类,并且想要在独立于类名的构造函数方法中使用你的代码,那么它会派上用场。