专栏首页算法与编程之美Python|类的多重继承及super()的调用

Python|类的多重继承及super()的调用

在python类中有关子类的多重继承所涉及的问题。如super函数,若是多个子类继承自相同的父类与不同的父类会有什么不同?当子类存在多个父类时,继承的先后顺序是怎样的?一起来探究一下其中的规律。

解决方案

代码示例:

class A(object): def __init__(self): print('A') super(A,self).__init__()class B(object): def __init__(self): print('B') super(B,self).__init__()class C(A): def __init__(self): print('C') super(C,self).__init__()class D(A): def __init__(self): print('D') super(D,self).__init__()class E(B,C): def __init__(self): print('E') super(E,self).__init__()class F(C,D): def __init__(self): print('F') super(F,self).__init__()class G(D,C,B): def __init__(self): print('G') super(G,self).__init__()if __name__=='__main__': f=F() g=G()

该代码涉及到多重继承问题,其中还涉及到了super这个函数。

运行这串代码会得到如下结果:

图 1 子类的多重继承

这时细心的朋友可能会提出问题:为什么当子类F继承C时,为什么C没有继续去继承A,而作为F的另一个父类D却去继承了A?这时就出现了这个C,D作为A的子类,同时又作为A的父类,当他们继承相同的父类A时,还要考虑到super函数的用法。

super函数的用法:

由上述代码可知,子类利用super函数来调用父类(超类),同理super()函数的语法:

super(type[,object-or-type])

含义:type=类object-or-type=类,一般是self。

如上述C作为例子;用法:

super(C.self).__init__()

首先super函数会找到C的父类(A),然后把C的类对象转化为父类(A)的类对象,然后调用父类对象的方法。

由上述的分析及结果可以得到一个结论:当多重继承中存在多个子类同时继承相同的父类时,且自身作为父类时(C,D均为F的父类),例如C,D两个子类同时去继承相同的父类(A)时,利用super()函数只会在最后一个调用父类(即D调用A)。

那若是不同的父类,那会出现什么情况呢?看如下代码:

class A(object): def __init__(self): print('A') super(A,self).__init__()class B(object): def __init__(self): print('B') super(B,self).__init__()class C(A): def __init__(self): print('C') super(C,self).__init__()class D(B): def __init__(self): print('D') super(D,self).__init__()class E(B,C): def __init__(self): print('E') super(E,self).__init__()class F(C,D): def __init__(self): print('F') super(F,self).__init__()class G(D,C,B): def __init__(self): print('G') super(G,self).__init__()if __name__=='__main__': f=F() g=G()

当D的父类变为B时,输出结果变为:

图 2 结果

由此可见,当父类变为不同时,super()就会分别调用各个父类,并输出每一个调用的父类,例子中的C,D就会分别调用他们的父类A和B,这样就会输出上述的结果。

结语

涉及多重继承关系中super()函数并不是去让子类继承父类并输出,而是将自身,即子类的对象转化为父类的对象并调用父类,明白这一点问题就迎刃而解了。

本文分享自微信公众号 - 算法与编程之美(algo_coding),作者:王卓越

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python|二叉树的三种深度遍历

    上次用python代码实现了二叉树,这次将会实现二叉树的几种遍历方法,来更好的解析二叉树的结构特点。分别是一种广度遍历(上篇博客已经提到),和三种深度遍历方法:...

    算法与编程之美
  • Python|有趣的shuffle方法

    Pythonrandom的“shuffle方法随机化序列项”是我们在学习中会经常遇到的一个知识点,今天我们就来简单的学习一下吧!

    算法与编程之美
  • 微信小程序|vant-dist的引用与屏幕宽度的获取

    微信小程序中需要用到许多代码,且毫无规律而言,对于刚接触微信小程序开发的开发者来说,想要完全记住并流畅的使用必定是难上加难的,那么有没有什么方法能够有效地解决这...

    算法与编程之美
  • Python多继承、super与MRO算法

    本文主要以Python3.x为例讲解Python多继承、super以及MRO算法。

    蒙娜丽宁
  • Python super().__init__和Base.__init__的区别

    我们在使用python中的类继承时,子类继承父类后,在重载父类的方法后,在方法中如果要执行父类对应的方法,一般有两种方式:super和Base(表示父类名)。

    星星在线
  • 【考研资料】送给有需要的人

    我偶然在网上找到一些考研复习的视频资料,内容比较丰富。于是想着分享出来,送给有需要的朋友。 1 19考研(文都考研资料) 链接:https://pan.bai...

    爱吃西瓜的番茄酱
  • 005从零开始学Python—字符串处理

    注:三引号是适用情况最多的字符串构造方法,而且三引号允许长字符串的换行,这是其他两种引号无法实现的,如变量string4所示。

    1480
  • 8.2.后端开发实践系列@SpringBoot 精选项目8 个

    简介:支付服务:支付宝、微信、银联详细 代码案例,目前已经1800+Star。十分钟让你快速搭建一个支付服务,内附各种教程。

    itjim
  • Python补充05 字符串格式化 (%操作符)

    在许多编程语言中都包含有格式化字符串的功能,比如C和Fortran语言中的格式化输入输出。Python中内置有对字符串进行格式化的操作%。 模板 格式化字符串时...

    Vamei
  • python 生成器&迭代器

    1、列表生成器:列表生成式就像是一个厨师,他只会做这n(n为任意整数)道菜,想吃甚麽做甚麽,不吃不做,不浪费空间;而列表表达式就相当于已经做好的n盘菜,占用空间...

    py3study

扫码关注云+社区

领取腾讯云代金券