Python类super(super().__init__())
Python中类的初始化都是__init__(), 所以父类和子类的初始化方式都是__init__(), 但是如果子类初始化时没有这个函数,那么他将直接调用父类的__init__(); 如果子类指定了__init__(), 就会覆盖父类的初始化函数__init__(),如果想在进行子类的初始化的同时也继承父类的__init__(), 就需要在子类中显示地通过super()来调用父类的__init__()函数。
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是预编译指令
super().init()是python3中简化后的方法,功能和super(self.class, self).init()一样