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实现登陆知乎获得个人收藏并保存为word文件
Mar 16 Python
Django imgareaselect手动剪切头像实现方法
May 26 Python
在Python的Django框架中编写错误提示页面
Jul 22 Python
黑科技 Python脚本帮你找出微信上删除你好友的人
Jan 07 Python
详解Python pygame安装过程笔记
Jun 05 Python
Python实现接受任意个数参数的函数方法
Apr 21 Python
对Python 内建函数和保留字详解
Oct 15 Python
python 解压pkl文件的方法
Oct 25 Python
Python语言进阶知识点总结
May 28 Python
Django基础三之视图函数的使用方法
Jul 18 Python
Python Socket TCP双端聊天功能实现过程详解
Jun 15 Python
pytorch中的torch.nn.Conv2d()函数图文详解
Feb 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
PHP中删除变量时unset()和null的区别分析
2011/01/27 PHP
php中将汉字转换成拼音的函数代码
2012/09/08 PHP
PHP实现用session来实现记录用户登陆信息
2018/10/15 PHP
PHP获取当前时间不准确问题解决方案
2020/08/14 PHP
基于jquery的放大镜效果
2012/05/30 Javascript
细说javascript函数从函数的构成开始
2013/08/29 Javascript
javascript自定义startWith()和endWith()的两种方法
2013/11/11 Javascript
jquery easyui 结合jsp简单展现table数据示例
2014/04/18 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
2016/09/09 Javascript
解析Javascript单例模式概念与实例
2016/12/05 Javascript
Bootstrap栅格系统使用方法及页面调整变形的解决方法
2017/03/10 Javascript
微信小程序实现折叠展开效果
2018/07/19 Javascript
跨域解决之JSONP和CORS的详细介绍
2018/11/21 Javascript
详解Vue2 添加对scss的支持
2019/01/02 Javascript
angular 实现下拉列表组件的示例代码
2019/03/09 Javascript
vue实现手机端省市区区域选择
2019/09/27 Javascript
[01:07:22]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG加赛
2014/05/26 DOTA
[57:38]2018DOTA2亚洲邀请赛3月30日 小组赛A组 OpTic VS OG
2018/03/31 DOTA
[00:12]DAC2018 no[o]ne亮相SOLO赛 他是否如他的id一样无人可挡?
2018/04/06 DOTA
[06:53]2018DOTA2国际邀请赛寻真——为复仇而来的Newbee
2018/08/15 DOTA
python实现清屏的方法
2015/04/30 Python
python中PIL安装简单教程
2016/04/21 Python
Python数据操作方法封装类实例
2017/06/23 Python
强悍的Python读取大文件的解决方案
2019/02/16 Python
Python字符串匹配之6种方法的使用详解
2019/04/08 Python
Python中如何导入类示例详解
2019/04/17 Python
Python使用20行代码实现微信聊天机器人
2020/06/05 Python
python使用numpy中的size()函数实例用法详解
2021/01/29 Python
Lancer Skincare官方网站:抗衰老皮肤护理
2020/11/20 全球购物
应聘美工求职信
2013/11/07 职场文书
学生周末回家住宿长期请假条
2014/02/15 职场文书
《莫高窟》教学反思
2014/02/25 职场文书
《郑和远航》教学反思
2014/04/16 职场文书
《领导干部从政道德启示录》学习心得体会
2016/01/20 职场文书
读《皮囊》有感:理解是对他人的最大的善举
2019/11/14 职场文书
Python socket如何解析HTTP请求内容
2022/02/12 Python