python的多重继承的理解


Posted in Python onAugust 06, 2017

python的多重继承的理解

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

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

经典类:

#! /usr/bin/python
# -*- coding:utf-8 -*-

class P1():
 def foo(self):
  print 'p1-foo'

class P2():
 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


if __name__ =='__main__':
 d=D()
 d.foo()
 d.bar()

执行的结果:

p1-foo
p2-bar

将代码实例,画了一个图,方便理解:

python的多重继承的理解

从上面经典类的输出结果来看,

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

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

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

 新式类: 

#! /usr/bin/python
# -*- coding:utf-8 -*-

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 
 

if __name__ =='__main__':
 print D.__mro__ #只有新式类有__mro__属性,告诉查找顺序是怎样的
 d=D()
 d.foo()
 d.bar()

执行的结果:

(<class '__main__.D'>, <class '__main__.C1'>, <class '__main__.C2'>, <class '__main__.P1'>, <class '__main__.P2'>, <type 'object'>)

p1-foo
C2-bar

从上面新式类的输出结果来看,

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

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

总结:新式类的搜索方式是采用“广度优先”的方式去查找属性。

以上就是Python的多重继承的详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
Python使用urllib2获取网络资源实例讲解
Dec 02 Python
Python获取DLL和EXE文件版本号的方法
Mar 10 Python
Python常用时间操作总结【取得当前时间、时间函数、应用等】
May 11 Python
Python设计模式之桥接模式原理与用法实例分析
Jan 10 Python
python如何获取列表中每个元素的下标位置
Jul 01 Python
python按行读取文件并找出其中指定字符串
Aug 08 Python
Python是怎样处理json模块的
Jul 16 Python
解决python 执行shell命令无法获取返回值的问题
Dec 05 Python
python switch 实现多分支选择功能
Dec 21 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
Jan 18 Python
python中numpy.empty()函数实例讲解
Feb 05 Python
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
Apr 03 Python
python中 chr unichr ord函数的实例详解
Aug 06 #Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
Aug 05 #Python
Python实现将Excel转换为json的方法示例
Aug 05 #Python
Python实现抓取网页生成Excel文件的方法示例
Aug 05 #Python
Python基于Socket实现的简单聊天程序示例
Aug 05 #Python
Python Socket实现简单TCP Server/client功能示例
Aug 05 #Python
对pandas的dataframe绘图并保存的实现方法
Aug 05 #Python
You might like
《破坏领主》销量已超100万 未来将继续开发新内容
2020/03/08 其他游戏
搜索引擎技术核心揭密
2006/10/09 PHP
php下一个阿拉伯数字转中文数字的函数
2007/07/16 PHP
php写的简易聊天室代码
2011/06/04 PHP
使用Appcan客户端自动更新PHP版本号(全)
2015/07/31 PHP
PHP实现的策略模式示例
2019/03/20 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
让您的菜单不离网站
2006/10/03 Javascript
CSS JavaScript 实现菜单功能 改进版
2008/12/09 Javascript
SlideView 图片滑动(扩展/收缩)展示效果
2010/08/01 Javascript
js监听键盘事件示例代码
2013/07/26 Javascript
jquery设置text的值示例(设置文本框 DIV 表单值)
2014/01/06 Javascript
动态加载jquery库的方法
2014/02/12 Javascript
深入理解JavaScript系列(37):设计模式之享元模式详解
2015/03/04 Javascript
完善的jquery处理机制
2016/02/21 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
Jquery实现跨域异步上传文件总结
2017/02/03 Javascript
vue使用xe-utils函数库的具体方法
2018/03/06 Javascript
JS获取并处理php数组的方法实例分析
2018/09/04 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
python3.3使用tkinter开发猜数字游戏示例
2014/03/14 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
Python中super函数用法实例分析
2019/03/18 Python
python打包exe开机自动启动的实例(windows)
2019/06/28 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
2019/08/12 Python
解决tensorflow训练时内存持续增加并占满的问题
2020/01/19 Python
Selenium常见异常解析及解决方案示范
2020/04/10 Python
基于python 凸包问题的解决
2020/04/16 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
可持续未来的时尚基础:Alternative Apparel
2019/05/06 全球购物
SHEIN台湾:购买最新流行女装服饰
2019/05/18 全球购物
Furla官网:意大利著名的皮革品牌
2019/08/06 全球购物
培训主管的职业生涯规划
2014/03/06 职场文书
国际贸易实务实训报告
2014/11/05 职场文书
2014年教务工作总结
2014/12/03 职场文书
win11自动弹出虚拟键盘怎么关闭? Win11关闭虚拟键盘的技巧
2023/01/09 数码科技