一、类的分类

1.1 新式类

  • 继承了object的类以及该类的子类,都是新式类

  • Python3中所有的类都是新式类

1.2 经典类

  • 没有继承object的类以及该类的子类,都是经典类

  • 只有Python2中才有经典类

二、菱形继承问题

在Java和C#中子类只能继承一个父类,而Python中子类可以同时继承多个父类,如A(B,C,D)

如果继承关系为非菱形结构,则会按照先找B这一条分支,然后再找C这一条分支,最后找D这一条分支的顺序直到找到我们想要的属性

如果继承关系为菱形结构,即子类的父类最后继承了同一个类,那么属性的查找方式有两种:

  • 经典类下:深度优先

  • 广度优先:广度优先

  • 经典类:一条路走到黑,深度优先

  • 新式类:不找多各类最后继承的同一个类,直接去找下一个父类,广度优先

  1. class G(object):
  2. # def test(self):
  3. # print('from G')
  4. pass
  5. print(G.__bases__)
  6. class E(G):
  7. # def test(self):
  8. # print('from E')
  9. pass
  10. class B(E):
  11. # def test(self):
  12. # print('from B')
  13. pass
  14. class F(G):
  15. # def test(self):
  16. # print('from F')
  17. pass
  18. class C(F):
  19. # def test(self):
  20. # print('from C')
  21. pass
  22. class D(G):
  23. # def test(self):
  24. # print('from D')
  25. pass
  26. class A(B, C, D):
  27. def test(self):
  28. print('from A')
  29. obj = A()
  1. (<class 'object'>,)
  1. obj.test() # A->B->E-C-F-D->G-object
  1. from A

三、C3算法与mro()方法介绍

python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表,如:

  1. print(A.mro()) # A.__mro__
  1. [<class '__main__.A'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.F'>, <class '__main__.D'>, <class '__main__.G'>, <class 'object'>]
  1. for i in A.mro():
  2. print(i)
  1. <class '__main__.A'>
  2. <class '__main__.B'>
  3. <class '__main__.E'>
  4. <class '__main__.C'>
  5. <class '__main__.F'>
  6. <class '__main__.D'>
  7. <class '__main__.G'>
  8. <class 'object'>

为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。

而这个MRO列表的构造是通过一个C3线性化算法来实现的。我们不去深究这个算法的数学原理,它实际上就是合并所有父类的MRO列表并遵循如下三条准则:

  1. 子类会先于父类被检查
  2. 多个父类会根据它们在列表中的顺序被检查
  3. 如果对下一个类存在两个合法的选择,选择第一个父类

python 菱形继承问题究极版的更多相关文章

  1. Python面向对象(组合、菱形继承、多态)

    今日内容: 1.组合 2.菱形继承 3.多态与多态性 昨天内容重点回顾: 1)调用也叫实例化:发生了2件事  1.创造空对象  2.触发对象下的__init__方法,然后将p连同参数一同传给init  ...

  2. Python多重继承之菱形继承

    继承是面向对象编程的一个重要的方式,通过继承,子类就可以扩展父类的功能.在python中一个类能继承自不止一个父类,这叫做python的多重继承(Multiple Inheritance ). 语法 ...

  3. 028.Python面向对象继承(单继承,多继承,super,菱形继承)

    一 继承的概念 种类 单继承 多继承 至少两个类: 子类:一个类继承另外一个类,那么该类是子类(也叫作衍生类) 父类:另外一个,这个被继承的类,叫做父类(也叫作超类),object 在python中 ...

  4. Day 23 类的继承,派生,组合,菱形继承,多态与多态性

    类的继承 继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类 继承的特性是:子类会遗传父类的属性 继承是类与类之间的关系 为什么用继承 使用继承可以减少代码的冗余 对象的继承 python中 ...

  5. Python进阶-继承中的MRO与super

    Python进阶-继承中的MRO与super 写在前面 如非特别说明,下文均基于Python3 摘要 本文讲述Python继承关系中如何通过super()调用"父类"方法,supe ...

  6. day21-4 菱形继承问题(类的查找顺序)

    目录 菱形继承问题 经典类(了解) 新式类 mro方法 菱形继承问题 在Python中子类可以同时继承多个父类,如A(B,C,D) 如果继承关系为非菱形结构,则会按照先找B这一条分支,然后再找C这条分 ...

  7. day35-2 类的三大特性---多态,以及菱形继承问题

    目录 菱形继承问题 经典类 新式类 菱形继承 大招 多态与多态性 多态 多态性 多态在Python中的体现 鸭子类型(重要) 结论 菱形继承问题 经典类 没有继承object类的就是经典类,只有Pyt ...

  8. day18-Python运维开发基础(单继承 / 多继承 / 菱形继承、类的多态)

    1. 单继承 / 多继承 / 菱形继承 # ### 继承 : 一个类除了自身所拥有的属性方法之外,还获取了另外一个类的成员属性和方法 """ 一个类可以继承另外一个类,那 ...

  9. Python学习手册(第4版) - 专业程序员的养成完整版PDF免费下载_百度云盘

    Python学习手册(第4版) - 专业程序员的养成完整版PDF免费下载_百度云盘 提取码:g7v1 作者简介 作为全球Python培训界的领军人物,<Python学习手册:第4版>作者M ...

随机推荐

  1. Linux 安装qt5-designer并集成到Pycharm

    在前面,有过介绍 Pycharm集成pyrcc4 =====>链接:  Pyqt 打包资源文件  这个是在Windows下集成,且pyqt在Windows下一个双击exe搞定. 在pyqt5之前 ...

  2. 玩转GET 和 POST

    HTTP 基本概念 HTTP Request Methods GET.POST 专业名称是 HTTP Request Methods.但 HTTP Request Methods 不只是 GET 和 ...

  3. java类路径classpath

    java编译器编译.java文件和java虚拟机执行.class文件时的路径和写法不一样. 在没有设置任何classpath环境变量的情况下,javac可以编译全路径的.java文件.例如: java ...

  4. SpringBoot与日志框架2(日志内斗)

    一.SpringBoot如何引入slf4j+logback框架的呢? 在POM文件中 <dependency> <groupId>org.springframework.boo ...

  5. ios12版本以上键盘唤起后,收回页面不回滚问题

    最近提测后,发现ios升级到12版本之后,引发了调用确认框的组件之后按钮失效问题. 然后开始了升级复现bug的各种操作,最后发现是完成后键盘收起后,页面没有回滚,因为页面整体被推上了一定高度,导致错位 ...

  6. AI零基础入门之人工智能开启新时代—下篇

    人工智能概述 人工智能的定义 · 人工智能是通过机器来模拟人类认识能力的一种科技能力 · 人工智能最核心的能力就是根据给定的输入做出判断或预测 · 思考:通过什么途径才能让机器具备这样的能力? · 举 ...

  7. django 常见错误汇总

    File "D:\python\django\mysite\mysite\view.py", line 7 SyntaxError: (unicode error) 'utf-8' ...

  8. Simple 杂题练手记

    Problem 1 世界上最可爱的珂朵莉 时间限制:C/C++ 1秒,空间限制:C/C++ 65536K 题目描述 我永远喜欢珂朵莉~! 有两个长为n的序列a[i]与b[i] 你可以把任意不多于x个a ...

  9. node07

    ---恢复内容开始--- 1.SQL基本查询语句 2.子句 1)WHERE 子句 WHERE key=val WHERE key>val WHERE key1>val1 AND key2& ...

  10. 圆形进度条css3样式

    <view class="con"> <view class="percent-circle percent-circle-left"> ...