论super().__init__()的用法
2021-01-25 20:00
10 查看
当我们调用 super() 的时候,实际上是实例化了super类。 super 是个类,既不是关键字也不是函数等其他数据结构,该对象就是专门用来访问父类中的属性的(严格按照继承的关系)。
--用法解析:
在子类的__init__方法中使用 super().__init__() , 就相当于把父类的 __init__构造方法拿过来用, 并且可以对父类的__init__方法进行补充(比如添加成员属性/方法) ,也就相当于把父类的__init__方法继承过来了, 之后用子类实例化一个对象后, 这个对象可以点出父类对象的成员属性/方法, 当然也可以点出自己类对象的成员属性/方法。因为子类继承父类时,子类中的__init__方法会覆盖掉父类的__init__方法, 导致无法通过实例化子类的类对象去给父类的类对象添加成员属性/方法,也无法调用父类类对象的属性/方法。
class Grade: def __init__(self, className): self.className = className def info(self): return "这是一个快班" class Student(Grade): def __init__(self, className, number, name, age, score): # super().__init__(className) self.number = number self.name = name self.age = age self.score = score def show_all(self): return "{}年级的学号为{}的学生姓名是{},年龄为{},分数是{}".format(self.className, self.number, self.name, self.age, self.score) zhansan = Student("六", "张三", "18", "1","99") print(zhansan.info()) print(zhansan.className)测试结果如下,从执行结果可以看出,子类Student虽然继承父类Grade,只能使用父类的方法,无法使用父类的属性,原因上述已经说过,因为子类的构造函数会覆盖掉父类的init函数。
"C:\Program Files\Python37\python.exe" D:/demo.py测试二,看下增加super().__init__(className)后的结果:
这是一个快班 Traceback (most recent call last): File "D:/AutoAndroidAPPDY/demo.py", line 110, in <module> print(zhansan.className) AttributeError: 'Student' object has no attribute 'className'
class Grade: def __init__(self, className): self.className = className def info(self): return "这是一个快班" class Student(Grade): def __init__(self, className, number, name, age, score): super().__init__(className) self.number = number self.name = name self.age = age self.score = score def show_all(self): return "{}年级的学号为{}的学生姓名是{},年龄为{},分数是{}".format(self.className, self.number, self.name, self.age, self.score) zhansan = Student("六", "张三", "18", "1","99") print(zhansan.info()) print(zhansan.className) print(zhansan.show_all())执行结果:
"C:\Program Files\Python37\python.exe" D:/demo.py
这是一个快班 六 六年级的学号为张三的学生姓名是18,年龄为1,分数是99此时Student已经成功继承了父类Grade的__init__,所以super().__init__()的作用也就显而易见了,就是执行父类的构造函数,使得我们能够调用父类的属性。 注:如果子类的__init__方法中,重写父类的属性,那再调用的时候,还是优先调用子类本身的值。
相关文章推荐
- Python super(Todo,self).__init__() TypeError: super() argument 1 must be type, not classobj
- loadView、viewDidLoad、initWithCoder、initWithNibName、awakeFromNib的用法
- python编程练习(小甲鱼)第36-40课(super()函数用法)
- self = [super init]
- linux常用关机命令shutdown、halt、poweroff、init用法
- Java 关键字super用法介绍
- 继承和super的用法
- Python中super()函数简介及用法分享
- if(self = (super init))的理解
- super用法
- loadView/viewDidLoad/initWithNibName/awakeFromNib/initWithCoder的用法
- Java中super的几种用法并与this的区别
- this 和super以及static的用法
- iOS self = [super init]
- 隐藏父类成员变量及super用法、接口
- Java中super关键字的三种用法
- 关于Python的super用法研究
- super的用法
- Python 经典类和新式类 super用法 (四)
- java基础 super用法