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使用正则表达式的search()函数实现指定位置搜索功能
Nov 10 Python
Python读写及备份oracle数据库操作示例
May 17 Python
Python面向对象之静态属性、类方法与静态方法分析
Aug 24 Python
python实现简易动态时钟
Nov 19 Python
Python字典循环添加一键多值的用法实例
Jan 20 Python
解决pycharm 远程调试 上传 helpers 卡住的问题
Jun 27 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
Oct 28 Python
wxPython+Matplotlib绘制折线图表
Nov 19 Python
python实现遍历文件夹图片并重命名
Mar 23 Python
Jupyter打开图形界面并画出正弦函数图像实例
Apr 24 Python
使用keras实现Precise, Recall, F1-socre方式
Jun 15 Python
Flask缓存静态文件的具体方法
Aug 02 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
php explode函数实例代码
2012/02/27 PHP
codeigniter教程之上传视频并使用ffmpeg转flv示例
2014/02/13 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
PHP连接SQL server数据库测试脚本运行实例
2020/08/24 PHP
js文件中调用js的实现方法小结
2009/10/23 Javascript
ExtJs GridPanel简单的增删改实现代码
2010/08/26 Javascript
js滚动条回到顶部的代码
2011/12/06 Javascript
javascript编码的几个方法详细介绍
2013/01/06 Javascript
js操作CheckBoxList实现全选/反选(在客服端完成)
2013/02/02 Javascript
浅析javascript中function 的 length 属性
2014/05/27 Javascript
js中跨域方法原理详解
2015/07/19 Javascript
js鼠标点击按钮切换图片-图片自动切换-点击左右按钮切换特效代码
2015/09/02 Javascript
JavaScript焦点事件、鼠标事件和滚轮事件使用详解
2016/01/15 Javascript
手机图片预览插件photoswipe.js使用总结
2016/08/25 Javascript
BootStrap中的表单大全
2016/09/07 Javascript
jQuery实现的两种简单弹窗效果示例
2018/04/18 jQuery
p5.js绘制创意自画像
2019/11/04 Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
2020/11/09 Javascript
[04:03]DOTA2英雄梦之声_第02期_风暴之灵
2014/06/30 DOTA
Python 字符串操作方法大全
2014/03/11 Python
python通过pil模块将raw图片转换成png图片的方法
2015/03/16 Python
使用Python下载歌词并嵌入歌曲文件中的实现代码
2015/11/13 Python
对json字符串与python字符串的不同之处详解
2018/12/19 Python
详解python中docx库的安装过程
2019/11/08 Python
PyTorch中反卷积的用法详解
2019/12/30 Python
python-图片流传输的思路及示例(url转换二维码)
2020/12/21 Python
法律顾问服务方案
2014/05/15 职场文书
2015年前台个人工作总结
2015/04/03 职场文书
员工加薪申请报告
2015/05/15 职场文书
2015年小学体育工作总结
2015/05/22 职场文书
单位证明范文
2015/06/18 职场文书
入党积极分子培养联系人意见
2015/08/12 职场文书
实用求职信模板范文
2019/05/13 职场文书
A22国内电台短波广播频率表
2022/05/10 无线电
MySql数据库 查询时间序列间隔
2022/05/11 MySQL
JS前端轻量fabric.js系列之画布初始化
2022/08/05 Javascript