Python中类的初始化都是__init__(), 所以父类和子类的初始化方式都是__init__(), 但是如果子类初始化时没有这个函数,那么他将直接调用父类的__init__(); 如果子类指定了__init__(), 就会覆盖父类的初始化函数__init__(),如果想在进行子类的初始化的同时也继承父类的__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类的初始化函数
super(Dog, self).__init__() # 在子类进行初始化时,也想继承父类的__init__()就通过super()实现,此时会对self.name= 'animal'
print('I am son')
self.name = 'dog' # 定义子类的name属性,并且会把刚才的self.name= 'animal'更新为'dog'
# animal = Animal()#I am father
xbai = Dog()#I am father,I am son
print(xbai.name)#'dog'
print(xbai.role)#'parent'
说明:super(Dog,self)也可以写成super(),可以理解成super(Dog,self).__init__() == Animal.__init__(self),( super(Dog,self) == Animal ) 即其返回的是当前类的继承顺序中(针对多继承)Dog后的一个类(也即类Animal)
self 和 super的区别:
self会首先调用自己的方法或者属性,当自身没有目标属性或方法时,再去父类中寻找;super会直接去父类中寻找目标属性或方法。如上述代码中定义完第十行后,self.name的返回值为’dog’,而super().name的返回值为’animal’;
self时类,super是预编译指令
————————————————
版权声明:本文为CSDN博主「wanghua609」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38145317/article/details/95190797