博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多继承下的super()指向的不一定是直接父类
阅读量:5096 次
发布时间:2019-06-13

本文共 725 字,大约阅读时间需要 2 分钟。

常规情况

class Base:    def __init__(self):        print('Base.__init__')class A(Base):    def __init__(self):        super().__init__()        print('A.__init__')class B(Base):    def __init__(self):        super().__init__()        print('B.__init__')class C(A,B):    def __init__(self):        super().__init__()         print('C.__init__')

1192583-20190408215248201-169562634.png

如果注释掉class B中的super

class B(Base):    def __init__(self):        # super().__init__()        print('B.__init__')

1192583-20190408215501002-294745132.png

super按照方法解析顺序(MRO)列表依次调用

在2中当注释掉B的super,显然Base.__init__没有被打印出来,意味着A的super并没有调用Base中的__init__,而是调用了B的__init__

super并不是代指直接父类的意思,而是指代MRO列表中的下一个类

对于你定义的每一个类,Python会计算出一个所谓的方法解析顺序(MRO)列表。 这个MRO列表就是一个简单的所有基类的线性顺序表。例如:
1192583-20190408215921358-284717740.png

详细查看:

转载于:https://www.cnblogs.com/Peter2014/p/10673817.html

你可能感兴趣的文章
Java语言概述
查看>>
关于BOM知识的整理
查看>>
Android设计模式源码解析之外观模式(Facade)
查看>>
使用word发布博客
查看>>
面向对象的小demo
查看>>
微服务之初了解(一)
查看>>
GDOI DAY1游记
查看>>
收集WebDriver的执行命令和参数信息
查看>>
数据结构与算法(三)-线性表之静态链表
查看>>
mac下的mysql报错:ERROR 1045(28000)和ERROR 2002 (HY000)的解决办法
查看>>
Hmailserver搭建邮件服务器
查看>>
django之多表查询-2
查看>>
快速幂
查看>>
改善C#公共程序类库质量的10种方法
查看>>
AIO 开始不定时的抛异常: java.io.IOException: 指定的网络名不再可用
查看>>
MyBaits动态sql语句
查看>>
HDU4405(期望DP)
查看>>
拉格朗日乘子法 那些年学过的高数
查看>>
vs code 的便捷使用
查看>>
Spring MVC @ResponseBody返回中文字符串乱码问题
查看>>