class A:
def __init__(self):
print("world")
class B(A):
def __init__(self):
print("hello")
B() # output: hello
在所有其他与super构造函数一起使用的语言中,都是隐式调用的。 如何在Python中调用它? 我期望super(self)
但这不起作用。
#1楼
super()
在新样式类中返回类似父对象的对象:
class A(object):
def __init__(self):
print("world")
class B(A):
def __init__(self):
print("hello")
super(B, self).__init__()
B()
#2楼
使用Python 2.x旧式类将是这样:
class A:
def __init__(self):
print "world"
class B(A):
def __init__(self):
print "hello"
A.__init__(self)
#3楼
一种方法是调用A的构造函数并将self
作为参数传递,如下所示:
class B(A):
def __init__(self):
A.__init__(self)
print "hello"
这种样式的优点是非常清晰。 它称为A的初始化程序。 缺点是,它不能很好地处理菱形继承,因为您可能最终会两次调用共享基类的初始化程序。
另一种方法是使用super(),如其他人所示。 对于单继承,它基本上与让您调用父级的初始化程序相同。
但是,super()的内幕要复杂得多,有时在多重继承情况下可能会违反直觉。 从正面来看,super()可用于处理菱形继承。 如果您想知道super()的作用的本质, 这里是我对super()的工作原理的最佳解释(尽管我不一定赞同该文章的观点)。
#4楼
与其他答案一致,有多种方法可以调用超类方法(包括构造函数),但是在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__()
按照docs super(<containing classname>, self)
super()
现在等效于super(<containing classname>, self)
。
#5楼
我使用以下公式扩展了先前的答案:
class A(object):
def __init__(self):
print "world"
class B(A):
def __init__(self):
print "hello"
super(self.__class__, self).__init__()
B()
这样,您不必在对super的调用中重复类的名称。 如果您要编码大量的类,并且希望使初始化程序方法中的代码与类名无关,那么它会很方便。
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3190220