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使用PyV8执行javascript代码示例分享
Dec 04 Python
Python实现115网盘自动下载的方法
Sep 30 Python
python通过pil为png图片填充上背景颜色的方法
Mar 17 Python
使用Python脚本对Linux服务器进行监控的教程
Apr 02 Python
Python中random模块生成随机数详解
Mar 10 Python
python获取当前运行函数名称的方法实例代码
Apr 06 Python
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
Nov 01 Python
在python中只选取列表中某一纵列的方法
Nov 28 Python
Python中的正则表达式与JSON数据交换格式
Jul 03 Python
Python 图像对比度增强的几种方法(小结)
Sep 25 Python
python函数enumerate,operator和Counter使用技巧实例小结
Feb 22 Python
keras 获取某层输出 获取复用层的多次输出实例
May 23 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
如何过滤高亮显示非法字符
2006/10/09 PHP
AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程
2010/05/10 PHP
[原创]PHP字符串中插入子字符串方法总结
2016/05/06 PHP
php str_replace替换指定次数的方法详解
2017/05/05 PHP
用js得到网页中所有的div的id
2020/10/19 Javascript
Script的加载方法小结
2011/01/12 Javascript
javascript中删除指定数组中指定的元素的代码
2011/02/12 Javascript
很棒的学习jQuery的12个网站推荐
2011/04/28 Javascript
jQuery学习笔记之jQuery.fn.init()的参数分析
2014/06/09 Javascript
js css 实现遮罩层覆盖其他页面元素附图
2014/09/22 Javascript
node.js中的fs.unlinkSync方法使用说明
2014/12/15 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
2016/06/21 Javascript
JS实现根据文件字节数返回文件大小的方法
2016/08/02 Javascript
AngularJs篇:使用AngularJs打造一个简易权限系统的实现代码
2016/12/26 Javascript
微信小程序 仿美团分类菜单 swiper分类菜单
2017/04/12 Javascript
node.js连接MongoDB数据库的2种方法教程
2017/05/17 Javascript
JavaScript原生实现观察者模式的示例
2017/12/15 Javascript
解决vue props 拿不到值的问题
2018/09/11 Javascript
关于自定义Egg.js的请求级别日志详解
2018/12/12 Javascript
详谈Object.defineProperty 及实现数据双向绑定
2020/07/18 Javascript
[48:30]LGD vs infamous Supermajor小组赛D组 BO3 第一场 6.3
2018/06/04 DOTA
python使用递归解决全排列数字示例
2014/02/11 Python
Python 对象中的数据类型
2017/05/13 Python
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
2017/09/08 Python
python如何在列表、字典中筛选数据
2018/03/19 Python
python对html过滤处理的方法
2018/10/21 Python
英国当代时尚和街头服饰店:18montrose
2018/12/15 全球购物
英国和世界各地预订便宜的酒店:LateRooms.com
2019/05/05 全球购物
企业管理专业个人求职信范文
2013/09/24 职场文书
住房公积金接收函
2014/01/09 职场文书
高三学习决心书
2014/03/11 职场文书
党员政治学习材料
2014/05/14 职场文书
招标保密承诺书
2015/01/20 职场文书
银行自荐信范文
2015/03/25 职场文书
CSS 制作波浪效果的思路
2021/05/18 HTML / CSS
CentOS7设置ssh服务以及端口修改方式
2022/12/24 Servers