super().__init__()用法
优先阅读:这个是我这个菜鸟自己理解的,误导别人概不负责~哈哈哈哈哈哈哈
一、何时要使用super.__init__():
我理解是,当需要继承父类构造函数中的内容,且子类需要在父类的基础上补充时,使用super().__init__()方法。
在这段代码中,New_person这个类即需要用到父类中name和age,又需要新增sex这个参数。这时就需要用到super().__init__()来继承父类中的name,和age。super().__init__()其实就是一个调用父类中__init__的函数。由于父类中的init有两个参数,所以super().__init__()也要传两个参数。
通过子类中的__init__函数获取到传的参数,并传给父类,如图中的传值关系。
当父类中的参数带有默认值时,super().__init__()调用父类中__init__也可以不传值(或传self),由于传值时self是可以省略的,所以写或不写结果是一样的。self在子类中代表子类本身,把self传到super().__init__()函数中,代表子类的__init__函数中的内容传给了父类。
只不过是通过子类中重写后传到父类中的。既然已经在子类中重写了self.name 、self.age、self.sex,那再调用super().__init__()函数就是多此一举了。即使把super().__init__()这句代码删掉也是没有影响的。
总之super().__init__()是为了继承父类中的__init__,继承后如果再子类中又重写那我觉得就是白继承了。。。
源码在此,可以自己修改感受一下:
class Person(): def __init__(self,name,age): self.name=name self.age=age def name1(self,name): #定义方法名时不要和变量名一样,否则在调用的时候可能会报错。 print('方法中名字 %s'%name) print('类中的名字 %s'%self.name) def age1(self,age): print('方法中的年龄 %s' %age) print('类中的年龄 %s' %self.age) class New_person(Person): def __init__(self,new_name,new_age,sex): super().__init__(new_name,new_age) self.sex=sex def diaoyong(self,name,age): self.name1(name) self.age1(age) def sex1(self,sex): print('方法中的性别 %s' %sex) print('类中的性别 %s' %self.age) new_p=New_person('小花','20','男') new_p.diaoyong('小米','15') new_p.sex1('女') # new_p.name1('xiaohua')
PS:还有就是,如果super().__init__()中,获取了子类中传的值,继承了父类。但是子类的__init__方法中,又把数据重写了,那再调用的时候,还是优先调用子类本身的值,如下图: