如何在Python中调用超级构造函数?

时光总嘲笑我的痴心妄想 提交于 2020-03-08 20:53:08
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的调用中重复类的名称。 如果您要编码大量的类,并且希望使初始化程序方法中的代码与类名无关,那么它会很方便。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!