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入门教程之if语句的用法
May 14 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
May 27 Python
Python之re操作方法(详解)
Jun 14 Python
python pandas dataframe 按列或者按行合并的方法
Apr 12 Python
python实现字符串中字符分类及个数统计
Sep 28 Python
Python操作rabbitMQ的示例代码
Mar 19 Python
详解python持久化文件读写
Apr 06 Python
Python数据类型之Tuple元组实例详解
May 08 Python
Python数据存储之 h5py详解
Dec 26 Python
Python Tornado实现WEB服务器Socket服务器共存并实现交互的方法
May 26 Python
详解python UDP 编程
Aug 24 Python
总结Pyinstaller打包的高级用法
Jun 28 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
jQuery+php实现ajax文件即时上传的详解
2013/06/17 PHP
PHP实现的简单mock json脚本分享
2015/02/10 PHP
MySql数据库查询结果用表格输出PHP代码示例
2015/03/20 PHP
php中分页及SqlHelper类用法实例
2017/01/12 PHP
Extjs ajax同步请求时post方式参数发送方式
2009/08/05 Javascript
jQuery 树形结构的选择器
2010/02/15 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
JS连接SQL数据库与ACCESS数据库的方法实例
2013/11/21 Javascript
javascript实现textarea中tab键的缩排处理方法
2015/06/26 Javascript
javascript实现加载xml文件的方法
2015/11/24 Javascript
在页面中输出当前客户端时间javascript实例代码
2016/03/02 Javascript
jQuery筛选数组之grep、each、inArray、map的用法及遍历json对象
2016/06/20 Javascript
浅谈Angularjs link和compile的使用区别
2016/10/21 Javascript
bootstrap模态框消失问题的解决方法
2016/12/02 Javascript
详解webpack + react + react-router 如何实现懒加载
2017/11/20 Javascript
JS实现利用闭包判断Dom元素和滚动条的方向示例
2019/08/26 Javascript
three.js 制作动态二维码的示例代码
2020/07/31 Javascript
vue项目中播放rtmp视频文件流的方法
2020/09/17 Javascript
Vue 的 v-model用法实例
2020/11/23 Vue.js
微信小程序实现modal弹出框遮罩层组件(可带文本框)
2020/12/20 Javascript
[05:03]2018DOTA2亚洲邀请赛主赛事首日回顾
2018/04/04 DOTA
tornado捕获和处理404错误的方法
2014/02/26 Python
Python字符串中查找子串小技巧
2015/04/10 Python
Django组件之cookie与session的使用方法
2019/01/10 Python
Django连接数据库并实现读写分离过程解析
2019/11/13 Python
Python实现计算长方形面积(带参数函数demo)
2020/01/18 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
2020/03/06 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
你需要学会的8个Python列表技巧
2020/06/24 Python
Python通过fnmatch模块实现文件名匹配
2020/09/30 Python
MyBag中文网:英国著名的时尚包袋电商零售网站
2020/07/31 全球购物
大学生求职自我评价
2014/01/16 职场文书
酒店前台岗位职责
2015/04/16 职场文书
个人收入证明范本
2015/06/12 职场文书
《用字母表示数》教学反思
2016/02/17 职场文书
Go使用协程交替打印字符
2021/04/29 Golang