python和C++一样,支持多继承。概念虽然容易,但是困难的工作是如果子类调用一个自身没有定义的属性,它是按照何种顺序去到父类寻找呢,尤其是众多父类中有多个都包含该同名属性。

class P1 #(object): def foo(self):           print 'p1-foo' class P2 #(object): def foo(self): print 'p2-foo' def bar(self): print 'p2-bar' class C1 (P1,P2): pass  class C2 (P1,P2): def bar(self): print 'C2-bar'   class D(C1,C2): pass

对经典类和新式类来说,属性的查找顺序是不同的。现在我们分别看一下经典类和新式类两种不同的表现

1、经典类

d=D()
d.foo() # 输出 p1-foo
d.bar() # 输出 p2-bar

实例d调用foo()时,搜索顺序是 D => C1 => P1

实例d调用bar()时,搜索顺序是 D => C1 => P1 => P2

换句话说,经典类的搜索方式是按照“从左至右,深度优先”的方式去查找属性。d先查找自身是否有foo方法,没有则查找最近的父类C1里是否有该方法,如果没有则继续向上查找,直到在P1中找到该方法,查找结束。

2、新式类

使用新式类要去掉第一段代码中的注释

d=D()
d.foo() # 输出 p1-foo
d.bar() # 输出 c2-bar

实例d调用foo()时,搜索顺序是 D => C1 => C2 => P1

实例d调用bar()时,搜索顺序是 D => C1 => C2

可以看出,新式类的搜索方式是采用“广度优先”的方式去查找属性。

python继承顺序相关推荐

  1. python进阶数据_Python 进阶

    高阶函数 定义 函数接受的参数是一个函数 函数的返回值为一个函数 满足以上2点中其中一个就是高阶函数 函数嵌套 定义 函数中def定义一个函数 嵌套会存在闭包, 其他情况不会有闭包(闭包闭的是变量) ...

  2. 春风桃李花开夜,秋雨梧桐叶落时——python面向对象三大特征(封装、继承、多态)

    九重城阙烟尘生,千乘万骑西南行. 翠华摇摇行复止,西出都门百余里. 六军不发无奈何,宛转娥眉马前死. 花钿委地无人收,翠翘金雀玉搔头. 君王掩面救不得,回看血泪相和流. 黄埃散漫风萧索,云栈萦纡登剑阁 ...

  3. python多继承顺序_Python多重继承方法解析顺序(MRO构建算法)

    分界 python的MRO算法有新旧两种,但并不是以python2和python3为界,具体的分隔为:在python2中如果定义类的时候没有指定父类是object,即定义为 class A: pass ...

  4. Python进阶-----类的继承顺序

    python的类可以继承多个类,如果继承多个类,那么其寻找方法的方式有:深度优先和广度优先 基类或者父类继承了object类,那么该类就是新式类,否则便是经典类 当类是经典类时,多继承情况下,会按照深 ...

  5. python四十六:继承顺序之线性顺序列表

    python是多继承,所以继承多个类时,会产生查找顺序的问题? 如下就是查找顺序 当类是经典类时,多继承情况下,会按照深度优先方式查找. 当类是新式类时,多继承情况下,会按照广度优先方式查找.(pyt ...

  6. python顺序结构有一个入口_高楼万丈平地起,基础要打牢!Python获取类的层次结构和继承顺序...

    上一篇内容我们详细了解了Python使用inspect模块获取一个模块.类.实例.函数的信息及帮助文档的方法(参见新手入门到进阶,你不可不知的模块,用Python获取对象的详细信息). 前情提要 今天 ...

  7. python多重继承初始化顺序_Python 多重继承顺序

    本文借鉴自 http://www.cnblogs.com/panyinghua/p/3283726.html 当类有多个超类,而且超类中有相同的方法时,继承顺序就很重要,如下: class A (de ...

  8. python中的继承冲突及继承顺序

    python中的继承冲突及继承顺序 简单的菱形继承 设计类如下 #mermaid-svg-IYOh6g5InwMB9svy {font-family:"trebuchet ms", ...

  9. Python菱形继承的初始化问题和继承顺序

    Python菱形继承的初始化问题和继承顺序 Python中,类通过继承的方式,子类可以获得父类的非私有属性和非私有方法,不需要自己再重新实现. 继承可以多层继承,即可以多代继承.也可以多继承,即一个子 ...

最新文章

  1. 关于GUI_DOWNLOAD中下载excel等文档的乱码问题
  2. 拓扑排序(完整案列及C语言完整代码实现)
  3. 作品第四课----agruments应用一求出函数参数的总合
  4. jquery 判断数据是否重复
  5. 螺旋遍历_螺旋形式的水平阶遍历
  6. css文件如何设置scss,Webpack - 如何将scss编译成单独的css文件?
  7. Shell脚本——入门
  8. Pandas 文本数据方法 cat()
  9. clclickhouse与bitmap的结合
  10. 计算机体系结构五大部分组成
  11. centos7yum安装VirtualBox
  12. php一句话 专杀,PHP-DDOS脚本专杀工具1.0 官方版
  13. 不透明度16进制值对照表
  14. oracle一次性说清楚,多种分隔符的一个字段拆分多行,再多行多列多种分隔符拆多行,最终处理超亿亿。。亿级别数据量
  15. 企业微信应用授权/静默登录
  16. 美式口语发音技巧:《发音总结》
  17. 机器学习 - 人脸识别
  18. Word 如何删除页面中的回车符 / 段落标记
  19. bootstrap的tooltip
  20. QT学习---QMainWindow

热门文章

  1. MySQL系列教程(一)
  2. 解题:使用 Promise 实现 machine 函数
  3. 深度deepin自研软件包格式“玲珑”:兼容所有Linux发行版
  4. 生产者消费者算法的简单实现
  5. 室内定位导航为啥小拓要选择蓝牙定位技术?
  6. Builder(生成器模式) 创建型
  7. OpenStack——自动安装部署
  8. 【正点原子FPGA连载】第二十三章 DDS信号发生器实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0
  9. Sysinternals---Process Explorer
  10. 伊吹萃香 (Standard IO)