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 相关文章推荐
wxpython中自定义事件的实现与使用方法分析
Jul 21 Python
python模拟登录并且保持cookie的方法详解
Apr 04 Python
Python实现对特定列表进行从小到大排序操作示例
Feb 11 Python
Python解析json时提示“string indices must be integers”问题解决方法
Jul 31 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
Sep 04 Python
python中如何使用insert函数
Jan 09 Python
Tensorflow限制CPU个数实例
Feb 06 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
Mar 31 Python
python中urllib.request和requests的使用及区别详解
May 05 Python
python virtualenv虚拟环境配置与使用教程详解
Jul 13 Python
Python Celery异步任务队列使用方法解析
Aug 10 Python
pytorch通过训练结果的复现设置随机种子
Jun 01 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
Laravel 前端资源配置教程
2019/10/18 PHP
不使用jquery实现js打字效果示例分享
2014/01/19 Javascript
推荐一个自己用的封装好的javascript插件
2015/01/29 Javascript
javascript实现确定和取消提示框效果
2015/07/10 Javascript
JavaScript中通过提示框跳转页面的方法
2016/02/14 Javascript
JavaScript自学笔记(必看篇)
2016/06/23 Javascript
微信JSAPI支付操作需要注意的细节
2017/01/10 Javascript
浅谈jQuery中事情的动态绑定
2017/02/12 Javascript
兼容浏览器的js事件绑定函数(详解)
2017/05/09 Javascript
利用Vue2.x开发实现JSON树的方法
2018/01/04 Javascript
详解vue axios二次封装
2018/07/22 Javascript
vue.js2.0 实现better-scroll的滚动效果实例详解
2018/08/13 Javascript
详解利用eventemitter2实现Vue组件通信
2019/11/04 Javascript
js实现的在本地预览图片功能示例
2019/11/09 Javascript
Vue仿百度搜索功能
2020/12/28 Vue.js
python数据结构之二叉树的统计与转换实例
2014/04/29 Python
Python如何获取系统iops示例代码
2016/09/06 Python
Python实现邮件的批量发送的示例代码
2018/01/23 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
2018/05/05 Python
python实现批量解析邮件并下载附件
2018/06/19 Python
Java文件与类动手动脑实例详解
2019/11/10 Python
python的json中方法及jsonpath模块用法分析
2019/12/06 Python
Python grequests模块使用场景及代码实例
2020/08/10 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
2021/01/08 Python
菲律宾领先的在线时尚商店:Zalora菲律宾
2018/02/08 全球购物
SIDESTEP荷兰:在线购买鞋子
2019/11/18 全球购物
泰国在线书店:SE-ED
2020/06/21 全球购物
大学军训感言
2014/01/10 职场文书
改革共识倡议书
2014/08/29 职场文书
2014年保育员个人工作总结
2014/12/02 职场文书
2015年教师党员自我评价材料
2015/03/04 职场文书
鲁冰花观后感
2015/06/10 职场文书
中学政教处工作总结
2015/08/13 职场文书
创业开店,这样方式更合理
2019/08/26 职场文书
canvas多重阴影发光效果实现
2021/04/20 Javascript
微信小程序纯CSS实现无限弹幕滚动效果
2022/09/23 HTML / CSS