菱形继承问题

一、类的分类

1.1 新式类

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

Python3中所有的类都是新式类

1.2 经典类

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

只有Python2中才有经典类

二、菱形继承问题

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

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

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

经典类下:深度优先

广度优先:广度优先

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

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

# 继承菱形问题: 新式类和经典类的查找顺序不一样

# 新式类的查找属性:广度优先

# 经典类:深度优先

class G():

a = 'ggg'

class F(G):

a = 'fff'

class E(F):

a = 'eee'

class D(E):

a = 'ddd'

class C(D):

a = 'ccc'

class B(C):

a = 'bbb'

class A(B, C, D):

a = 'aaa'

a = A()

print(a.a)

# mro 列表,查看继承顺利列表(只在新式类中有)

print(A.mro())

print(A.__mro__)

obj = A()

(,)

obj.test() # A->B->E-C-F-D->G-object

from A

继承菱形问题在python3中显示的都是继承一个类,不是object类, 新式类和经典类的查找顺序是不一样

新式类(python3中全是新式类):广度优先---从左侧开始,一直往上找,找到菱形的顶点结束(不包含菱形顶点),继续下一个继承父类往上找,找到菱形的顶点结束(不包含括菱形的顶点),最后找到菱形顶点

经典类(python2中才有):深度优先搜索---从左侧开始,一直往上找,找到菱形顶点结束(包括菱形顶点),继续下一个继承父类往上找,找到菱形的顶点结束(不包含菱形顶点)

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

[

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

print(A.mro()) # A.__mro__

[, , , , , , , ]

for i in A.mro():

print(i)

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

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

子类会先于父类被检查

多个父类会根据它们在列表中的顺序被检查

如果对下一个类存在两个合法的选择,选择第一个父类

python菱形继承参数问题_菱形继承问题相关推荐

  1. python用可变参数求积_流畅的python读书笔记-第八章-对象引用、可变性和垃圾回收...

    对象不是个盒子 class Gizmo: def __init__(self): print('Gizmo id: %d' % id(self)) x = Gizmo() print(x) y = G ...

  2. unity 继承了 获取_获取继承链

    Babybus-u3d技术交流-获取继承链 打算用ICode做整个框架的逻辑,发现有挺多不尽人意的地方,无奈只能从源代码开始着手改造. 1.png 点击添加Action时会动态的添加一些已有的组件,看 ...

  3. python函数作为参数例题_笨办法学Python 习题 19: 函数和变量

    函数这个概念也许承载了太多的信息量,不过别担心.只要坚持做这些练习,对照上个练习中的检查点检查一遍这次的联系,你最终会明白这些内容的. 有一个你可能没有注意到的细节,我们现在强调一下:函数里边的变量和 ...

  4. python 类初始化参数校验_如何规避python参数的初始化次数?

    我们在内存不足的时候,除了增加内存的可用度,可以进行一个清理内存的初始化操作,当然这种是最后迫不得已的选择.我们在python中也有需要用到初始化的地方,鉴于参数和函数的关系密不可分,本篇我们会简单的 ...

  5. C++_类和对象_C++继承_继承的方式_公共继承_保护继承_私有继承---C++语言工作笔记062

    然后我们再去看c++中的继承,现在我们来看,c++中继承的, 3种方式. 去看上面的图,可以看到,有公共继承,有保护继承,有私有继承.3种方式. 我们去写代码去看看.首先,我们写个Base1类, 然后 ...

  6. python函数默认参数位置_二十二、Python函数参数类型(位置、关键字、默认、不定长参数)...

    调用函数时可使用的参数类型 在调用Python函数时可使用的参数类型主要有以下几种: 必要参数(位置参数) 关键字参数 默认参数 不定长参数 必要参数(位置参数) 在Python中, 必要参数必须以正 ...

  7. python函数注释 参数 省略号_解决python 输出是省略号的问题

    这个问题非常非常重要,搞了一晚上都没解决好,但是真的很简单很简单, 如果你也 是用的numpy array, 如果你也想得到输出矩阵的全部内容,而不是省略形式, [[ 0.10284943 0.095 ...

  8. python如何调用参数配置文件_【Python学习笔记七】从配置文件中读取参数

    将一些需要经常更改的参数存放在配置文件中,通过读取配置文件来获取参数,这样修改以及使用起来比较方便 1.首先是配置文件的写法,如下一个environment.ini文件: a:里面"[]&q ...

  9. C++_类和对象_C++继承_菱形继承_或钻石继承_问题及利用虚继承解决该问题---C++语言工作笔记068

    然后我们再来看一下在c++继承中的,一个很好玩的内容, 菱形继承,又叫 钻石继承. 比如我们有个动物类,然后 羊继承了这个动物类,然后驼也继承了这个动物类, 然后,羊驼,通过多继承,继承了羊类和驼类, ...

  10. C++继承详解三 ----菱形继承、虚继承

    转载:http://blog.csdn.net/pg_dog/article/details/70175488 今天呢,我们来讲讲菱形继承与虚继承.这两者的讲解是分不开的,要想深入了解菱形继承,你是绕 ...

最新文章

  1. 成熟的GAN会自己分析脸部纹理!英伟达StyleGAN团队出新作,网友:竟然还能有突破...
  2. 算法 判断一个数是不是2的n次幂
  3. python超简单小游戏代码-Python实现简单的猜单词小游戏
  4. [云炬创业学笔记]第二章决定成为创业者测试15
  5. 苹果4如何添加时间插件_苹果手机如何添加九键或26键输入法?iPhone怎样快速切换输入法?...
  6. 晨风机器人怎么买奴隶_潮牌复刻和正品该怎么抉择???带你了解了解
  7. MySQL锁定机制简介
  8. 震精 - PostgreSQL 递归查询 - 树型数据按路径分组输出
  9. JSP中使用的模式——JSP+Servlet+JavaBean
  10. linux 浏览器缓存目录在哪里找,火狐浏览器缓存文件在什么位置?缓存文件位置分享...
  11. 《原则》瑞达利欧_epub+mobi+azw3
  12. Java实现按分数排名,同分同名次
  13. Android Edittext设置软键盘输入法Enter回车键为完成按钮
  14. 计算图片的相似度(深度学习)
  15. java项目设计与思路
  16. 电商后台设计:品类管理
  17. 2021-6-8-今日收获
  18. Redis min-slaves-to-write
  19. 基于STC15W408AS蓝牙智能小车
  20. python代码重构技巧_Python代码重构

热门文章

  1. 面试:视频播放器相关优化参考
  2. idea的工具栏显示
  3. java heap space 什么意思_java heap space是什么意思?
  4. Deep Learning中的层结构
  5. cmake: 使用jom实现msvc工程并发编译提高速度(-j)
  6. JavaScript网页设计:用户登录页面
  7. java金额小数位,java 数字转大写金额,小数部分太简单略
  8. python redis教程_Python与Redis的连接教程
  9. iic上拉电阻的阻值计算方法与特性
  10. .NET EF~Entity Framework详解(lambda表达式、linq到EF)