技术背景

python中的super,名为超类,可以简单的理解为执行父类的__init__函数。由于在python中不论是一对一的继承,还是一子类继承多个父类,都会涉及到执行的先后顺序的问题。那么本文就着重看下super的具体作用。

案例测试

通过设计这样一个案例,我们可以明确super的前后逻辑关系:先定义一个父类initial,在这个父类中有参数值param和函数func,然后用子类new来继承父类initial。继承之后,在子类的__init__函数中super执行的前后去打印参数值param和函数func的返回值,相关代码如下所示:

# 定义父类
class initial(object):def __init__(self):print ('This print is from initial object')# 定义父类参数self.param = 3# 定义父类函数def func(self):return 1# 定义子类
class new(initial):def __init__(self):print ('This print is from new object')# 打印子类函数值print (self.func())# 执行父类初始化函数super(new, self).__init__()# 打印父类参数值print(self.param)self.param = 4# 定义子类函数def func(self):return 2if __name__ == '__main__':new()

代码的执行结果如下所示:

This print is from new object
2
This print is from initial object
3

结果分析

首先我们注意到,父类initial中的__init__函数内的打印语句,是在super之后才输出的,这说明了,super函数是在执行父类的初始化操作。那么如果没有执行supernew子类对initial父类的继承体现在哪里呢?答案就是父类的成员函数,比如这样的一个案例:

class initial(object):def __init__(self):print ('This print is from initial object')self.param = 3def func(self):return 1class new(initial):def __init__(self):print ('This print is from new object')print (self.func())super(new, self).__init__()print(self.param)self.param = 4if __name__ == '__main__':new()

其实就是删掉了子类中重载的成员函数,那么得到的结果如下:

This print is from new object
1
This print is from initial object
3

可以发现在执行super之前就可以打印父类的func函数的函数值。所以python中继承的逻辑是这样的:

\[initial.func()\\ \Downarrow\\ new.\_\_init\_\_()\\ \Downarrow\\ new.func()/new.param\\ \Downarrow\\ super()\\ \Downarrow\\ initial.\_\_init\_\_()/initial.param\\ \Downarrow\\ new.\_\_init\_\_()/new.param \]

也正是因为只有执行了super才能初始化父类中的成员变量,因此如果在super之前是无法访问父类的成员变量的。

总结概要

本文通过一个python的实际案例的设计,来讲解python面向对象的技术——类的继承中必用的super函数的逻辑。其实我们可以把python中类的继承理解成这样的一个过程:当我们在括号中明确了父类时,其实已经引用了父类的成员函数,但是并没有执行父类的初始化函数。在执行子类的初始化函数的同时,会检查是否重载了父类的成员函数,如果重载则会直接覆盖。而只有在执行了super之后,才相当于执行了父类的初始化函数,此时才可以访问父类的成员变量。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/super.html

作者ID:DechinPhy

更多原著文章请参考:https://www.cnblogs.com/dechinphy/

打赏专用链接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

腾讯云专栏同步:https://cloud.tencent.com/developer/column/91958

python中的super是什么?相关推荐

  1. Python中的super()函数

    多路继承的问题 描述: 解决这样的问题Python中可以使用super() super()函数有点: (1)在父类中可以直接的调用未绑定的方法 (2)在确保所有的父类的构造方法都使用了super()函 ...

  2. Python中的super()用法

    Python中的super()方法设计目的是用来解决多重继承时父类的查找问题,所以在单重继承中用不用 super 都没关系:但是,使用 super() 是一个好的习惯.一般我们在子类中需要调用父类的方 ...

  3. python中的super用法详解_【Python】【类】super用法详解

    一.问题的发现与提出 在Python类的方法(method)中,要调用父类的某个方法,在Python 2.2以前,通常的写法如代码段1: 代码段1: class A: def __init__(sel ...

  4. python中的super用法详解_Python中super函数用法实例分析

    本文实例讲述了python中super函数用法.分享给大家供大家参考,具体如下: 这是个高大上的函数,在python装13手册里面介绍过多使用可显得自己是高手 23333. 但其实他还是很重要的. 简 ...

  5. python中superclass是什么_深度解析并实现python中的super(转载,好文)

    大神半个月的成绩,让我看的叹为观止,建议看原帖地址,会让你对Python的描述符有更强的认识. 原文链接:https://blog.csdn.net/zhangjg_blog/article/deta ...

  6. Python中的super()简单用法

    如果在子类中也定义了_init_()函数,那么该如何调用基类的_init_()函数: 方法一.明确指定 : class C(P):def __init__(self):P.__init__(self) ...

  7. pythonsuper继承规则,深入理解Python中的super()方法

    前言 python的类分别有新式类和经典类,都支持多继承.在类的继承中,如果你想要重写父类的方法而不是覆盖的父类方法,这个时候我们可以使用super()方法来实现 python语言与C++有相似的类继 ...

  8. 5分钟了解 Python 中的super函数是如何实现继承的

    Py 2.x 和 Py 3.x 中有一个很大的区别就是类,无论是类的定义还是类的继承.Py 3.x 中类的继承可以直接使用 super() 关键字代替原来的 super(Class, self). 那 ...

  9. pythonsuper函数_认识python中的super函数

    需求分析 在类继承中,存在这么一种情况: class Human(object): def Move(self): print("我会走路...") class Man(Human ...

最新文章

  1. 驱动 2.4'' TFT 串口触摸屏
  2. 2020年人工智能领域的最大创新
  3. java取geosever数据_Geoserver - 连接到SQL Server 2008 Express并获取数据
  4. JDBC连接mysql、创建表、操作数据、PreparedStatement防注入、sql语句返回值类型知识汇总
  5. 外观、体验升级 HUAWEI WATCH 2 Pro成智能手表领航者
  6. java jpanel 叠加_java – 如何在JPanel上叠加,调整大小和居中组件?
  7. 10 SystemVerilog语言编写SPI发送
  8. dta乱码_DTA是自动化索引的出色工具
  9. 单通道GNSS模拟器行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  10. python中处理WordNet
  11. 使用jdk进行数据迁移(sqlite迁移mysql)
  12. 共轭梯度法Matlab的实现
  13. 澳洲java5年的评价薪水有多少,刚刚,澳洲平均薪资出炉,感受一下世界第一的最低薪资标准!...
  14. C++算法之化繁为简的分治法
  15. 泰坦尼克号乘客获救预测
  16. 用turtle作画玩一玩吧
  17. 这些微信头像,你敢换吗?
  18. bat 批处理 B站缓存视频转成 .mp4格式
  19. 如何编辑简单打字游戏
  20. oracle数据安全管理实验,第四次Oracle数据库上机实验-bistu

热门文章

  1. 消息中间件合集:MQ(ActiveMQ/RabbitMQ/RocketMQ)+Kafka+笔记
  2. 德国的共享杯,共享碗--还有什么不能共享?
  3. 二叉树算法--数据结构课程设计
  4. 数字高程(移动曲面)拟合(C++)
  5. 数论——卢卡斯(Lucas)定理(板子)
  6. MySQL数据库——MySQL修改/删除字段
  7. 去中心化金融 (DeFi)
  8. 服务器重启django项目
  9. 如何查看本地是否安装oracle, 查看安装的Oracle客户端版本
  10. tinymce富文本框踩坑