当我们调用 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
这是一个快班
Traceback (most recent call last):
File "D:/AutoAndroidAPPDY/demo.py", line 110, in <module>
print(zhansan.className)
AttributeError: 'Student' object has no attribute 'className'
 
测试二,看下增加super().__init__(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__方法中,重写父类的属性,那再调用的时候,还是优先调用子类本身的值。

论super().__init__()的用法的更多相关文章

  1. Python子类构造函数调用super().__init__()用法说明

    一.super的作用 1.如果子类(Puple)继承父类(Person)不做初始化,那么会自动继承父类(Person)属性name.2.如果子类(Puple_Init)继承父类(Person)做了初始 ...

  2. Python中super函数的用法

    之前看python文档的时候发现许多单继承类也用了super()来申明父类,那么这样做有何意义? 从python官网文档对于super的介绍来看,其作用为返回一个代理对象作为代表调用父类或亲类方法.( ...

  3. python中super()的一些用法

    在看python高级编程这本书的时候,在讲到super的时候,产生了一些疑惑,super在python中的用法跟其他的语言有一些不一样的地方,在网上找了一些资料,发现基本上很少有文章能把我的疑惑讲明白 ...

  4. 推荐使用的派生方法:super().__init__()

    """ 推荐使用的派生方法:super().__init__() --super()的属性查找顺序是从当前位置开始找,根据mro列表,当前没有就往上找. super() ...

  5. python中super().__init__和类名.__init__的区别

    super().__init__相对于类名.__init__,在单继承上用法基本无差 但在多继承上有区别,super方法能保证每个父类的方法只会执行一次,而使用类名的方法会导致方法被执行多次 多继承时 ...

  6. super函数的用法

    1.创建一个类. # .创建一个类 class Bird: def __init__(self): self.hungry =True def eat(self): if self.hungry: p ...

  7. python3 super().__init__()

    父类不会自动调用__init__方法 class A: def __init__(self): A = 'A' self.a = 'a' print('init A') class B(A): def ...

  8. 解读typescript中 super关键字的用法

    解读typescript中 super关键字的用法 传统的js,使用prototype实现父.子类继承.如果父.子类有同名的方法,子类去调用父类的同名方法需要用 “父类.prototype.metho ...

  9. python3 super().__init__() 和 __init__() 的区别

    1.单继承 super().__int__()和 Base.__init__(self)是一样的, super()避免了基类的显式调用. class Base(object): def __init_ ...

随机推荐

  1. post 和php://input

    $_POST['paramName'] 获取通过表单(multipart/form-data)提交的数据.但有时客户端会直接将请求数据以字符串的形式都放到 body 里传递过来,那么服务端就需要使用  ...

  2. LightningChart -XY 2D图表特性

    LightningChart -XY 2D图表--2D图表 系列类型:抽样数据(离散数据).点线.任意形式的点线.面积.高低.多边形.股票系列(蜡烛图).条.带.恒定线.强度网格和强度网强度系列能够渲 ...

  3. 百度Echarts中国地图经纬度

    百度显示中国地图的地址 https://www.makeapie.com/explore.html#sort=rank~timeframe=all~author=all%3Ftdsourcetag v ...

  4. python序列(四)成员资格判断

    判断是否存在指定的值 1.count()方法,如果存在则返回大于0的数,如果返回0则表示不存在. 2."in"关键字来判断一个值是否存在于列表中,返回结果为"True&q ...

  5. 诡异的NPE--三目运算自动类型转换

    今天在项目中碰到一个诡异的空指针异常的问题,刚开始很不解,明明自己做了空判断,为什么还是出现了空指针呢? 最后排查出来的原因是:三目运算符的自动类型匹配机制. 现场 java.lang.NullPoi ...

  6. ajax上传单个文件

    jsp页面 <%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML> ...

  7. JAVA多线程下高并发的处理经验

    java中的线程:java中,每个线程都有一个调用栈存放在线程栈之中,一个java应用总是从main()函数开始运行,被称为主线程.一旦创建一个新的线程,就会产生一个线程栈.线程总体分为:用户线程和守 ...

  8. 表单序列化json字符串和js时间格式化

    js时间格式化 new Date().format("时间格式") Date.prototype.format = function(fmt) { var o = {        ...

  9. 拖拽一个元素如此简单,mouse、drag、touch三兄弟的用处

    最近需要做一个投票活动,上传图片时需要拖拽.缩放来裁剪图片,vue的组件不少,不过自己动手才能丰衣足食,一味使用别人的组件实在难以进步,所以自己研究一番. 一.mouse.drag.touch傻傻分不 ...

  10. CentOS 8 安装Nginx

    安装命令: dnf install nginx -y 这就安装完成了 ,对你没看错一个命令就已经把nginx安装好了,不信你通过 nginx -V 命令查看. 常用操作: 1.nginx配置文件目录 ...