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实现的数据结构与算法之快速排序详解
Apr 22 Python
利用Celery实现Django博客PV统计功能详解
May 08 Python
Python利用递归和walk()遍历目录文件的方法示例
Jul 14 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
Jul 31 Python
python Django 创建应用过程图示详解
Jul 29 Python
django中使用POST方法获取POST数据
Aug 20 Python
Python3.7 读取 mp3 音频文件生成波形图效果
Nov 05 Python
python应用Axes3D绘图(批量梯度下降算法)
Mar 25 Python
Python自动登录QQ的实现示例
Aug 28 Python
scrapy实践之翻页爬取的实现
Jan 05 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
Jan 09 Python
Python爬虫入门教程02之笔趣阁小说爬取
Jan 24 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
Zend framework处理一个http请求的流程分析
2010/02/08 PHP
使用PHP强制下载PDF文件示例
2014/01/17 PHP
php smarty模板引擎的6个小技巧
2014/04/24 PHP
PHP生成自定义长度随机字符串的函数分享
2014/05/04 PHP
使用CodeIgniter的类库做图片上传
2014/06/12 PHP
ThinkPHP中Session用法详解
2014/11/29 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
2018/06/13 PHP
PHP正则匹配到2个字符串之间的内容方法
2018/12/24 PHP
javascript据option的value值快速设定初始的selected选项
2007/08/13 Javascript
javascript 硬盘序列号+其它硬件信息
2008/12/23 Javascript
javascript下对于事件、事件流、事件触发的顺序随便说说
2010/07/17 Javascript
基于jquery的商品展示放大镜
2010/08/07 Javascript
jquery实现页面关键词高亮显示的方法
2015/03/12 Javascript
jquery序列化方法实例分析
2015/06/10 Javascript
JavaScript文本框脚本编写的注意事项
2016/01/25 Javascript
BootStrap 智能表单实战系列(五) 表单依赖插件处理
2016/06/13 Javascript
jQuery zTree树插件简单使用教程
2017/01/10 Javascript
基于openlayers4实现点的扩散效果
2020/08/17 Javascript
Vue iview-admin框架二级菜单改为三级菜单的方法
2018/07/03 Javascript
详解在React中跨组件分发状态的三种方法
2018/08/09 Javascript
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
2019/06/04 jQuery
vue 插件的方法代码详解
2019/06/06 Javascript
Vue3为什么这么快
2020/09/23 Javascript
python Django批量导入数据
2016/03/25 Python
python爱心表白 每天都是浪漫七夕!
2018/08/18 Python
Python绘制的二项分布概率图示例
2018/08/22 Python
Python增强赋值和共享引用注意事项小结
2019/05/28 Python
django之状态保持-使用redis存储session的例子
2019/07/28 Python
Python Web框架之Django框架cookie和session用法分析
2019/08/16 Python
Python selenium的基本使用方法分析
2019/12/21 Python
详解python如何引用包package
2020/06/07 Python
python:删除离群值操作(每一行为一类数据)
2020/06/08 Python
python中有帮助函数吗
2020/06/19 Python
python 爬取B站原视频的实例代码
2020/09/09 Python
学籍证明模板
2015/06/18 职场文书
使用Redis实现点赞取消点赞的详细代码
2022/03/20 Redis