当前位置: 首页 > news >正文

【python基础】super是啥,你会用吗?

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 2

if __name__ == '__main__':
    new()

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

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

需要源码、教程,或者是自己有关python不懂的问题,都可以来这里哦 https://jq.qq.com/?_wv=1027&k=byXFCxLC 这里还有学习资料与免费课程领取

结果分析

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

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

if __name__ == '__main__':
    new()

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

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

可以发现在执行super之前就可以打印父类的func函数的函数值。所以python中继承的逻辑是这样的:
请添加图片描述
也正是因为只有执行了super才能初始化父类中的成员变量,因此如果在super之前是无法访问父类的成员变量的。

请添加图片描述

需要源码、教程,或者是自己有关python不懂的问题,都可以来这里哦 https://jq.qq.com/?_wv=1027&k=byXFCxLC 这里还有学习资料与免费课程领取

总结

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

好啦,今天的分享到这里就结束了 ~
对文章有问题的,或者有其他关于python的问题,可以在评论区留言或者私信我哦
觉得我分享的文章不错的话,可以关注一下我,或者给文章点赞(/≧▽≦)/

请添加图片描述

相关文章:

  • 反向传播和其他微分算法
  • 爆肝撸了个“羊了个羊”通关助手
  • Flutter快学快用17 打包发布:Flutter 应用,你离线上运营只差最后一步
  • 效果超强!基于Prompt Learning、检索思路实现文本分类,开源数据增强、可信增强技术
  • 第五次线上面试总结(2022.9.21 二面)
  • 多容器SSM整合
  • 如何用架构的思维为云原生做减法?
  • 程序员面试必备软技能,值得收藏!
  • IDEA社区版(Community Edition)创建Springboot-Web项目,Java
  • 全能赛道、热门方向、稀缺数据,“嬴彻-清华AIR杯”自动驾驶技术大赛火热开赛中
  • 案例分享 | 高性能材料企业官网3D可视化升级
  • 深度学习——day22 知识回顾class1:什么是神经网络
  • Kubernetes基础服务安装
  • 怎么画深度优先生成树和广度优先生成树【简答题】
  • 谷歌成功利用一台 54 量子比特的量子计算机
  • [NodeJS] 关于Buffer
  • bearychat的java client
  • JavaScript中的对象个人分享
  • Linux快速复制或删除大量小文件
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Python socket服务器端、客户端传送信息
  • 从PHP迁移至Golang - 基础篇
  • 观察者模式实现非直接耦合
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 我建了一个叫Hello World的项目
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 怎么把视频里的音乐提取出来
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​学习一下,什么是预包装食品?​
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #每日一题合集#牛客JZ23-JZ33
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (6)添加vue-cookie
  • (70min)字节暑假实习二面(已挂)
  • (C++20) consteval立即函数
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (solr系列:一)使用tomcat部署solr服务
  • (多级缓存)多级缓存
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (一)基于IDEA的JAVA基础10
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET MVC第五章、模型绑定获取表单数据
  • .net快速开发框架源码分享
  • .考试倒计时43天!来提分啦!
  • :如何用SQL脚本保存存储过程返回的结果集
  • @Bean有哪些属性