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
centos系统升级python 2.7.3
Jul 03 Python
Python中暂存上传图片的方法
Feb 18 Python
python3使用urllib模块制作网络爬虫
Apr 08 Python
python3利用tcp实现文件夹远程传输
Jul 28 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
Aug 03 Python
python一键去抖音视频水印工具
Sep 14 Python
python实现车牌识别的示例代码
Aug 05 Python
matplotlib制作雷达图报错ValueError的实现
Jan 05 Python
微软开源最强Python自动化神器Playwright(不用写一行代码)
Jan 05 Python
PyQt5中QSpinBox计数器的实现
Jan 18 Python
Python爬虫自动化爬取b站实时弹幕实例方法
Jan 26 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
PHP缓存技术的使用说明
2011/08/06 PHP
一个完整的php文件上传类实例讲解
2015/10/27 PHP
php 截取GBK文档某个位置开始的n个字符方法
2017/03/08 PHP
永不消失的title提示代码
2007/02/15 Javascript
JS获取scrollHeight问题想到的标准问题
2007/05/27 Javascript
JavaScript 创建运动框架的实现代码
2013/05/08 Javascript
jQuery中的编程范式详解
2014/12/15 Javascript
js实现a标签超链接提交form表单的方法
2015/06/24 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
2015/09/26 Javascript
jQuery Mobile和HTML5开发App推广注册页
2016/11/07 Javascript
适用于手机端的jQuery图片滑块动画
2016/12/09 Javascript
vuejs事件中心管理组件间的通信详解
2017/08/09 Javascript
vue2.0路由切换后页面滚动位置不变BUG的解决方法
2018/03/14 Javascript
Vue-Quill-Editor富文本编辑器的使用教程
2018/09/21 Javascript
vue实现多个元素或多个组件之间动画效果
2018/09/25 Javascript
vue实现数据控制视图的原理解析
2020/01/07 Javascript
python 打印直角三角形,等边三角形,菱形,正方形的代码
2017/11/21 Python
浅谈Django REST Framework限速
2017/12/12 Python
简单实现python进度条脚本
2017/12/18 Python
python数据封装json格式数据
2018/03/04 Python
win7下python3.6安装配置方法图文教程
2018/07/31 Python
python 使用sys.stdin和fileinput读入标准输入的方法
2018/10/17 Python
Pandas缺失值2种处理方式代码实例
2020/06/13 Python
英国著名国际平价时尚男装品牌:Topman
2016/08/27 全球购物
Timberland法国官网:购买靴子、鞋子、衣服、夹克和配饰
2019/11/30 全球购物
英国健身专家:WIT Fitness
2021/02/09 全球购物
linux下进程间通信的方式
2014/12/23 面试题
客服主管岗位职责
2013/12/13 职场文书
高一物理教学反思
2014/01/24 职场文书
机械工程师岗位职责
2014/06/16 职场文书
教育见习报告范文
2014/11/03 职场文书
小学生毕业评语
2014/12/26 职场文书
2015年生产车间工作总结
2015/04/22 职场文书
限期整改通知书
2015/04/22 职场文书
javascript数组includes、reduce的基本使用
2021/07/02 Javascript
详细聊聊浏览器是如何看闭包的
2021/11/11 Javascript