Python中类的初始化都是__init__(), 所以父类和子类的初始化方式都是__init__()
但是如果 1.子类初始化时没有这个函数__init__() ,那么他将直接调用父类的__init__();
2.如果子类指定了__init__(), 就会覆盖父类的初始化函数__init__()
3.如果想在进行子类的初始化的同时也继承父类的__init__(), 就需要在子类中显示地通过super()来调用父类的__init__()函数。
super()在单继承中的应用:
举个例子:
class Animal: #定义一个父类
def __init__(self): #父类的初始化
self.name = 'animal'
self.role = 'parent'
print('I am father')
class Dog(Animal): #定一个继承Animal的子类
def __init__(self): #子类的初始化函数,此时会覆盖父类Animal类的初始化函数
print('I am son')
self.name = 'dog' #定义子类的name属性
super(Dog,self).__init__() #在子类进行初始化时,也想继承父类的__init__()就通过super()实现
#self.name = 'dog' #若将name属性的定义(即第10行)放在这儿,最终输出将是dog
animal = Animal()
xbai = Dog()
print(xbai.name)
print(xbai.role)
输出为
I am father #实例化Animal类后的输出
I am son #实例化Dog类后的输出
I am father #实例化Dog类后的输出
animal #由于子类初始化是在进行继承父类初始化之前,因此super()执行后,Dog类的name属性被父类覆盖
parent #继承了父类的role属性
说明:super(Dog,self)也可以写成super(),可以理解成super(Dog,self).init() == Animal.init(self),( super(Dog,self) == Animal ) 即其返回的是当前类的继承顺序中(针对多继承)Dog后的一个类(也即类Animal)
参考:https://blog.csdn.net/larryli007/article/details/83476441