如何调用超级构造函数?
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中重复类的名字了。 如果你编码了大量的类,并且想要在独立于类名的构造函数方法中使用你的代码,那么它会派上用场。