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多线程编程方式分析示例详解
Dec 06 Python
微信跳一跳小游戏python脚本
Jan 05 Python
浅析PHP与Python进行数据交互
May 15 Python
Numpy数据类型转换astype,dtype的方法
Jun 09 Python
Python 查找list中的某个元素的所有的下标方法
Jun 27 Python
python之super的使用小结
Aug 13 Python
python 构造三维全零数组的方法
Nov 12 Python
Centos部署django服务nginx+uwsgi的方法
Jan 02 Python
Python selenium根据class定位页面元素的方法
Feb 26 Python
python计算n的阶乘的方法代码
Oct 25 Python
Python3实现飞机大战游戏
Apr 24 Python
通过cmd进入python的步骤
Jun 16 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 array_reduce()函数的应用解析
2018/10/28 PHP
用 Javascript 验证表单(form)中多选框(checkbox)值
2009/09/08 Javascript
文本有关的样式和jQuery求对象的高宽问题分别说明
2013/08/30 Javascript
javascript放大镜效果的简单实现
2013/12/09 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
2016/08/24 Javascript
jQuery展示表格点击变色、全选、删除
2017/01/05 Javascript
js实现交通灯效果
2017/01/13 Javascript
jQuery基本筛选选择器实例代码
2017/02/06 Javascript
基于jQuery实现一个marquee无缝滚动的插件
2017/03/09 Javascript
JavaScript实现打地鼠小游戏
2020/04/23 Javascript
在Create React App中启用Sass和Less的方法示例
2019/01/16 Javascript
原生js通过一行代码实现简易轮播图
2019/06/05 Javascript
Vue中的transition封装组件的实现方法
2019/08/13 Javascript
ES6基础之 Promise 对象用法实例详解
2019/08/22 Javascript
vue-cli单页面预渲染seo-prerender-spa-plugin操作
2020/08/10 Javascript
Python中的对象,方法,类,实例,函数用法分析
2015/01/15 Python
Python模糊查询本地文件夹去除文件后缀的实例(7行代码)
2017/11/09 Python
Python实现的井字棋(Tic Tac Toe)游戏示例
2018/01/31 Python
python json.loads兼容单引号数据的方法
2018/12/19 Python
python爬虫超时的处理的实例
2018/12/19 Python
python DataFrame转dict字典过程详解
2019/12/26 Python
Django ValuesQuerySet转json方式
2020/03/16 Python
python操作ini类型配置文件的实例教程
2020/10/30 Python
canvas粒子动画背景的实现示例
2018/09/03 HTML / CSS
浅谈HTML5 &amp; CSS3的新交互特性
2016/07/19 HTML / CSS
美国领先的汽车轮胎和轮毂供应商:TireBuyer
2016/07/21 全球购物
职业规划书如何设计?
2014/01/09 职场文书
表扬信格式
2014/01/12 职场文书
七一表彰活动方案
2014/01/18 职场文书
服装行业创业计划书范文
2014/02/05 职场文书
生物科学专业职业规划书范文
2014/02/11 职场文书
车辆转让协议书
2014/04/15 职场文书
数控专业毕业生求职信
2014/06/12 职场文书
2015学校六五普法工作总结
2015/04/22 职场文书
读鲁迅先生的经典名言
2019/08/20 职场文书
python opencv检测直线 cv2.HoughLinesP的实现
2021/06/18 Python