当我们调用 super() 的时候,实际上是实例化了一个 super 类。 super 是个类,既不是关键字也不是函数等其他数据结构,该对象就是专门用来访问父类中的属性的(严格按照继承的关系)。
--用法解析:
  在子类的__init__方法中使用 super().__init__() , 就相当于把父类的 __init__构造方法拿过来用, 并且可以对父类的__init__方法进行补充(比如添加成员属性/方法) ,也就相当于把父类的__init__方法继承过来了, 之后用子类实例化一个对象后, 这个对象可以点出父类对象的成员属性/方法, 当然也可以点出自己类对象的成员属性/方法。因为子类继承父类时,子类中的__init__方法会覆盖掉父类的__init__方法, 导致无法通过实例化子类的类对象去给父类的类对象添加成员属性/方法,也无法调用父类类对象的属性/方法。
  1. class Grade:
  2. def __init__(self, className):
  3. self.className = className
  4. def info(self):
  5. return "这是一个快班"
  6.  
  7. class Student(Grade):
  8. def __init__(self, className, number, name, age, score):
  9. # super().__init__(className)
  10. self.number = number
  11. self.name = name
  12. self.age = age
  13. self.score = score
  14.  
  15. def show_all(self):
  16. return "{}年级的学号为{}的学生姓名是{},年龄为{},分数是{}".format(self.className,
  17. self.number, self.name, self.age, self.score)
  18.  
  19. zhansan = Student("六", "张三", "18", "1","99")
  20. print(zhansan.info())
  21. print(zhansan.className)
  测试结果如下,从执行结果可以看出,子类Student虽然继承父类Grade,只能使用父类的方法,无法使用父类的属性,原因上述已经说过,因为子类的构造函数会覆盖掉父类的init函数。
  1. "C:\Program Files\Python37\python.exe" D:/demo.py
    这是一个快班
  2. Traceback (most recent call last):
  3. File "D:/AutoAndroidAPPDY/demo.py", line 110, in <module>
  4. print(zhansan.className)
  5. AttributeError: 'Student' object has no attribute 'className'
 
测试二,看下增加super().__init__(className)后的结果:
  1. class Grade:
  2. def __init__(self, className):
  3. self.className = className
  4. def info(self):
  5. return "这是一个快班"
  6.  
  7. class Student(Grade):
  8. def __init__(self, className, number, name, age, score):
  9. super().__init__(className)
  10. self.number = number
  11. self.name = name
  12. self.age = age
  13. self.score = score
  14.  
  15. def show_all(self):
  16. return "{}年级的学号为{}的学生姓名是{},年龄为{},分数是{}".format(self.className,
  17. self.number, self.name, self.age, self.score)
  18.  
  19. zhansan = Student("六", "张三", "18", "1","99")
  20. print(zhansan.info())
  21. print(zhansan.className)
  22. print(zhansan.show_all())
执行结果:
  1. "C:\Program Files\Python37\python.exe" D:/demo.py
  1. 这是一个快班

  2. 六年级的学号为张三的学生姓名是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. 网站开发学习Python实现-Django学习-介绍(6.1.1)

    @ 目录 1.MVT 2.ORM 关于作者 1.MVT 主要的目的是为了快速,简便的开发数据库驱动的网站,强调代码的复用,多个组件可以很方便以插件的方式服务于整个框架,采用的是MVT设计模式(差不多的 ...

  2. matplotlib的学习10-Contours 等高线图

    import matplotlib.pyplot as plt import numpy as np ''' 画等高线 数据集即三维点 (x,y) 和对应的高度值,共有256个点. 高度值使用一个 h ...

  3. TP学习第二天—

    一.控制器和对应方法的创建 2.路由解析 传统的路由解析方法: 具体url地址模式设置(配置文件在 ThinkPHP/Conf/convertion.php) 停到了之前的 黑马传智的 TP课,换了个 ...

  4. 基于Layuimini的自己封装后台模板

    基于Layui的后台模板,正在开发中 交流qq群:1062635741 邮箱:zhangqueque.foxmail.com GitHub:https://github.com/ZhangQueque ...

  5. 解决UE4缓存使C盘膨胀的问题

    使用UE4的时候会发现C盘越来越小了,那是因为UE4引擎的缓存文件默认保存在C盘的缘故. 概述 一.出现的问题:UE4的缓存文件会导致C盘膨胀. 二.解决的方式:请严格按照下列步骤来执行.1. 更改U ...

  6. 安装简易OpenShift单节点并配置DNS泛域名

    1 楔子 公司有个项目部署在 OpenShift 容器云平台上,出现问题较多,于是萌生在公司环境搭建现场仿真环境,由于资源没有生产环境多,就使用单节点简单模拟下 本文主要内容包括以下: 使用 Dnsm ...

  7. JavaDailyReports10_20

    1 package varycode; 2 class Grandparent 3 { 4 public Grandparent() 5 { 6 7 System.out.println(" ...

  8. python之scrapy框架基础搭建

    一.创建工程 #在命令行输入scrapy startproject xxx #创建项目 二.写item文件 #写需要爬取的字段名称 name = scrapy.Field() #例 三.进入spide ...

  9. C语言实现九大排序算法

    C语言实现九大排序算法 直接插入排序 折半插入排序 希尔排序 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 基数排序 C语言实现九大排序算法 直接插入排序 将数组分为两个部分,一个是有序部分,一 ...

  10. Laya Ts 简易对象池

    ts版本的简易对象池 ,目前主要支持3D的物体,也可以将其改成其他类型 要使用首先调用InitPool 方法 `/* 使用说明: 使用必须先调用 InitPool 方法将对象池初始化 然后 Deque ...