以为python支持多继承,因此在复杂的继承关系下很容易弄错属性的查找顺序,今天特意学习了下

python3用的是c3线性化算法,听名字很高大上,公式我也看了,看不懂,但是这不影响理解查找的顺序

先看下面一张图片:

乍一看好晕

Python类继承父类,在当前类中都是从左往右查找

把顶层O看成第一层,第一层没什么好看的,就一个O类

看第二层C  A  B  D  E,可以用如下表达式表示:

L(C) = [C,O]   L(A) = [A,O]   L(B) = [B,O]   L(D) = [D,O]  L(E) = [E,O]

第三层:首先看K1,K1继承了C  A  B

L(K1) = [K1] + merge(L(C),L(A),L(B),(C,A,B))   # 后面的CAB表示继承自CAB

L(K1) = [K1] + merge([C,O],[A,O],[B,O],(C,A,B))   # 首先看这一行表达式,我们先取出L(C)中的第一个元素C,发现L(A),L(B)的尾部(尾部指除第一个元素外后面的元素都是尾部)都没有C这个元素,因此把它取出来放到前面的这个K1列表中

L(K1) = [K1,C] + merge([O],[A,O],[B,O],(C,A,B))    # 然后把L(C)中的C元素删除

L(K1) = [K1,C] + merge([O],[A,O],[B,O],(A,B))   # 然后在对比O元素,发现后面都有,因此看第二个L(A)列表取出第一个A元素,进行对比,发现L(C),L(B)中都没有

L(K1) = [K1,C,A] + merge([O],[O],[B,O],(B))   # 以此类推

L(K1) = [K1,C,A,B] + merge([O],[O],[O])

L(K1) = [K1,C,A,B,O]  # 这就是K1类的查找顺序了

L(K3) = [K3,A,D,O]

L(K2) = [K2,B,D,E,O]

L(Z) = [Z] + merge(L(K1),L(K1),L(K1),(K1,K3,K2))

L(Z) = [Z] + merge[K1,C,A,B,O],[K3,A,D,O],[K2,B,D,E,O],(K1,K3,K2))    # 先取K1,发现后面列表尾部并没有,尾部指除第一个元素外后面的元素都是尾部

L(Z) = [Z,K1] + merge[C,A,B,O],[K3,A,D,O],[K2,B,D,E,O],(K3,K2))   # 还是从第一个列表开始,取C进行比较,得下面表达式

L(Z) = [Z,K1,C] + merge([A,B,O],[K3,A,D,O],[K2,B,D,E,O],(K3,K2))  # 取A发现  第二类表尾部有,这时看第二个列表的K3,以此类推

L(Z) = [Z,K1,C,K3,A,K2,B,D,E,O]

这就是C3算法,今天有点晚了,明天粘上代码

python继承属性_python继承,属性查找顺序相关推荐

  1. python类属性和实例属性_Python 类属性与实例属性,类对象与实例对象用法分析...

    本文实例讲述了Python 类属性与实例属性,类对象与实例对象用法.分享给大家供大家参考,具体如下: demo.py(类属性,所有实例对象共用类属性): # 定义工具类 继承object是为了兼容py ...

  2. python对象的三个属性_Python 对象属性的访问

    在 Python 中,一切皆对象.属性访问可以理解为是从一个已有的对象中获得另一个对象的方法.对象属性的访问涉及到对象的 __dict__ 属性.描述符等概念,以及 __getattribute__. ...

  3. python面向对象属性_Python面向对象属性

    也是好久没有更新过了,今天主要想写的就是关于面向的对象的属性的问题. 属性的解释来看,能够简单的理解为方法但是是用字段的方式来调用方法.除此之外,另外一种是不加装饰器,利用python提供方式来写,根 ...

  4. python类的属性和对象属性_python 类属性、对象属性-阿里云开发者社区

    类的普通属性: dir(Myclass), 返回一个key列表: Myclass.__dir__,返回一个字典: 1.类的数据属性: 2.类的方法: 类的特殊属性: 1.Myclass.__name_ ...

  5. python属于私有属性_Python私有属性和受保护的属性原理解析

    前言: Python不能像Java那样使用 private 和 protected 修饰符创建私有属性和受保护的属性,但是Python有个简单的机制,能避免子类意外覆盖"私有"属性 ...

  6. python实例属性与类属性_Python类属性与实例属性用法分析

    容器(Collections) Python附带一个模块,它包含许多容器数据类型,名字叫作collections.我们将讨论它的作用和用法. 我们将讨论的是: - defaultdict - coun ...

  7. python的实例属性_python 实例属性和类属性

    如何在一个类中定义一些常量,每个对象都可以方便访问这些常量而不用重新构造? 第一个问题,在 Python 的类里,你只需要和函数并列地声明并赋值,就可以实现这一点, 例如这段代码中的 WELCOME_ ...

  8. python中init外面的属性_Python mock属性在\uyu init中定义和设置__

    我正在尝试为一个应用程序编写一些单元测试,我使用python mock.我对其他嘲弄库很熟悉,直到现在也没遇到过什么麻烦.我试图模拟对父类的init块中的属性集的链式调用.以下是我需要的示例:clas ...

  9. python 私有属性_Python 私有属性和私有方法

    类的私有属性和方法 Python是个开放的语言,默认情况下所有的属性和方法都是公开的 或者叫公有方法,不像C++和 Java中有明确的public,private 关键字来区分私有公有. Python ...

最新文章

  1. 主机信息收集技术 -Nmap
  2. c语言spi测试代码,spi_test.c的spi跟踪(spi 数据传送流程)
  3. 在html中写三角,css3怎么写三角形?
  4. layui的tree实现 struts 2+layui+jsp
  5. python 干什么工作具有明显优势-Python 的优势在哪里?
  6. linux不同内核驱动移植问题,基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)...
  7. Java 多线程 简单实例 (Thread)
  8. shape中的ring标签的使用方法
  9. java json解析哪个好_java常用的几种json解析工具使用
  10. VsCode同步印象笔记
  11. 新手iso系统怎么安装 新手安装iso镜像文件详细步骤
  12. APP多平台快速切换
  13. c语言控制台数字键打地鼠,C语言编程打地鼠
  14. office 论文 页码_WORD目录,页眉,页脚,页码设置技巧 为你的毕业论文收藏吧-以Word 2013演示...
  15. 【秒懂】数据分析没头绪?这七种高手常用统计分析方法都帮你总结好了!
  16. python 怎么算l2范数_向量范数与矩阵范数(L0, L1, L2)
  17. 【网络安全态势感知学习笔记】——“行远自迩”基础篇一:网络安全态势感知的基本概念
  18. 城市三级联动功能实现
  19. vue如何配置兼容ie es6转es5
  20. 追梦PM——记我250天的互联网产品经理求职历程

热门文章

  1. 制作不同方向的三角形(border属性)
  2. Android工程的目录说明
  3. python如何写各种小工具_python写了个小工具
  4. html获取url后面的参数_Golang Gin 实战(四)| URL查询参数的获取和原理分析
  5. java必学_Java基础系列之初识JAVA
  6. [洪流学堂]Hololens开发入门篇2之Hello World
  7. Linux命令完全指南route,Linux命令--route
  8. (三)使用Keras构建移动风格迁移CycleGAN
  9. 通过GitHub Actions构建和部署Jekyll网站
  10. stat在python中_stat模块接口