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

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

Python

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

那么 super() 到底是依据什么来继承的呢?今天就来分析下。

super()函数根据传进去的两个参数具体作用如下:

通过第一参数传进去的类名确定当前在MRO中的哪个位置。MRO(Method Resolution Order);

通过第二个参数传进去的self,确定当前的MRO列表。

def super(cls, inst):
   mro = inst.__class__.mro() #确定当前MRO列表
   return mro[mro.index(cls) + 1] #返回下一个类

如下代码:

class A(object):
    def name(self):
        print('name is xiaoming')    
        #super(A,self).name()

class B(object): 
    def name(self):
        print('name is cat')

class C(A,B):
    def name(self):
        print('name is wang')
        super(C,self).name()if __name__ == '__main__':

c = C()
print(c.__class__.__mro__)
c.name()

执行以上代码输出:当执行C类下的super()函数时,实际调用了A类下的name函数。A中注释掉了super()函数,所以并没有向后继续执行。并且打印出了当前MRO列表顺序为C,A,B,object.

(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)name is wangname is xiaoming

当我们把A类中的注释去掉后,执行代码输出:可以看到,当A执行后继续执行了B中的name()函数。如果B中仍然有super函数则会继续向上去查找object中是否有name()函数。

(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)name is wangname is xiaomingname is cat

关注公众号:「Python专栏」,后台回复「腾讯架构资源1」,获取由腾讯架构师整理的大数据学习资源包全套!!!

![Python专栏二维码](https://img-blog.csdnimg.cn/20190228220401806.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIzNjU4Mjg=,size_4,color_FFFFFF,t_70#pic_center =200x200)

转载于:https://blog.51cto.com/miracleyoung/2358736

相关文章:

  • LINQ To SQL在N层应用程序中的CUD操作、批量删除、批量更新
  • 问题:什么情况UDP的非阻塞写会失败?
  • 一次服务器CPU占用率高的定位分析
  • [HNOI2015]实验比较
  • Springboot简介01
  • 我的作业,来看看把
  • ReentrantLock
  • OSChina 周日乱弹 —— 去应聘男友吧
  • 在网站开发中很有用的8个 jQuery 效果【附源码】
  • 装上这几个 VSCode 插件后,上班划水摸鱼不是梦
  • 三谈属性动画——Keyframe以及ViewPropertyAnimator
  • 湖北分布式智能数据采集方法有哪些?
  • C#用正则表达式一键Unicode转UTF8(解决LitJson中文问题)
  • vue + echarts画圈圈
  • 微软职位内部推荐-SENIOR SDE
  • 深入了解以太坊
  • 《剑指offer》分解让复杂问题更简单
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 10个最佳ES6特性 ES7与ES8的特性
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Brief introduction of how to 'Call, Apply and Bind'
  • django开发-定时任务的使用
  • Git同步原始仓库到Fork仓库中
  • HTTP那些事
  • leetcode-27. Remove Element
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Rancher-k8s加速安装文档
  • unity如何实现一个固定宽度的orthagraphic相机
  • WePY 在小程序性能调优上做出的探究
  • 飞驰在Mesos的涡轮引擎上
  • 关于使用markdown的方法(引自CSDN教程)
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 前端学习笔记之观察者模式
  • 如何编写一个可升级的智能合约
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 通过调用文摘列表API获取文摘
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​力扣解法汇总946-验证栈序列
  • # 达梦数据库知识点
  • #{}和${}的区别?
  • #mysql 8.0 踩坑日记
  • #QT(串口助手-界面)
  • (1)虚拟机的安装与使用,linux系统安装
  • (12)Linux 常见的三种进程状态
  • (14)Hive调优——合并小文件
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (33)STM32——485实验笔记
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (二)丶RabbitMQ的六大核心
  • (未解决)macOS matplotlib 中文是方框
  • (转)使用VMware vSphere标准交换机设置网络连接
  • .NET 使用配置文件