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 Mysql数据库操作 Perl操作Mysql数据库
Jan 12 Python
python开发简易版在线音乐播放器
Mar 03 Python
python 剪切移动文件的实现代码
Aug 02 Python
一百多行python代码实现抢票助手
Sep 25 Python
python图像和办公文档处理总结
May 28 Python
pandas DataFrame 交集并集补集的实现
Jun 24 Python
浅谈Pandas Series 和 Numpy array中的相同点
Jun 28 Python
Django项目基础配置和基本使用过程解析
Nov 25 Python
Python中使用filter过滤列表的一个小技巧分享
May 02 Python
Python内置函数property()如何使用
Sep 01 Python
给numpy.array增加维度的超简单方法
Jun 02 Python
python中pymysql包操作数据库方法
Apr 19 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
虹吸式咖啡壶操作
2021/03/03 冲泡冲煮
php实现的替换敏感字符串类实例
2014/09/22 PHP
PHP验证信用卡卡号是否正确函数
2015/05/27 PHP
WordPress中给文章添加自定义字段及后台编辑功能区域
2015/12/19 PHP
滚动经典最新话题[prototype框架]下编写
2006/10/03 Javascript
jquery 插件 web2.0分格的分页脚本,可用于ajax无刷新分页
2008/12/25 Javascript
js判断IE6/IE7/FF的代码[XMLHttpRequest]
2011/02/16 Javascript
JavaScript之HTMLCollection接口代码
2011/04/27 Javascript
深入理解JavaScript系列(34):设计模式之命令模式详解
2015/03/03 Javascript
javascript实时显示北京时间的方法
2015/03/12 Javascript
如何使用jquery easyui创建标签组件
2015/11/18 Javascript
JS数组排序方法实例分析
2016/12/16 Javascript
jquery.masonry瀑布流效果
2017/05/25 jQuery
获取url中用&amp;隔开的参数实例(分享)
2017/05/28 Javascript
BootStrap daterangepicker 双日历控件
2017/06/02 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
2018/04/01 Javascript
jquery实现垂直手风琴菜单
2020/03/04 jQuery
[50:59]2018DOTA2亚洲邀请赛 4.7 总决赛 LGD vs Mineski第四场
2018/04/10 DOTA
Python实现的生产者、消费者问题完整实例
2018/05/30 Python
详解Python3中setuptools、Pip安装教程
2019/06/18 Python
关于PySnooper 永远不要使用print进行调试的问题
2021/03/04 Python
用CSS3实现Win8风格的方格导航菜单效果
2013/04/10 HTML / CSS
纽约香氛品牌:NEST Fragrance
2018/10/15 全球购物
澳大利亚音乐商店:Bava’s Music City
2019/05/05 全球购物
Currentbody西班牙:美容仪专家
2019/09/28 全球购物
美国椅子和沙发制造商:La-Z-Boy
2020/10/25 全球购物
制定岗位职责的原则
2013/11/08 职场文书
新浪微博实习心得体会
2014/01/27 职场文书
初中生期末评语大全
2014/04/24 职场文书
三好学生先进事迹材料
2014/08/28 职场文书
2015年法制宣传月活动总结
2015/03/26 职场文书
钢琴师观后感
2015/06/12 职场文书
Python Django框架介绍之模板标签及模板的继承
2021/05/27 Python
深入解析Apache Hudi内核文件标记机制
2022/03/31 Servers
ipad隐藏软件app图标方法
2022/04/19 数码科技
Win11 Beta 22621.601 和 22622.601今日发布 KB5017384修复内容汇总
2022/09/23 数码科技