python中的多重继承实例讲解


Posted in Python onSeptember 28, 2014

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中实现远程调用(RPC、RMI)简单例子
Apr 28 Python
python实现多线程暴力破解登陆路由器功能代码分享
Jan 04 Python
Python实现获取本地及远程图片大小的方法示例
Jul 21 Python
利用Python将每日一句定时推送至微信的实现方法
Aug 13 Python
浅谈pycharm的xmx和xms设置方法
Dec 03 Python
python简单实现AES加密和解密
Mar 28 Python
python sklearn库实现简单逻辑回归的实例代码
Jul 01 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
Sep 26 Python
python根据文本生成词云图代码实例
Nov 15 Python
tensorflow求导和梯度计算实例
Jan 23 Python
python 用struct模块解决黏包问题
Nov 07 Python
python如何进行基准测试
Apr 26 Python
python错误处理详解
Sep 28 #Python
python中实现定制类的特殊方法总结
Sep 28 #Python
python之wxPython菜单使用详解
Sep 28 #Python
python中lambda函数 list comprehension 和 zip函数使用指南
Sep 28 #Python
python之wxPython应用实例
Sep 28 #Python
Python实现从url中提取域名的几种方法
Sep 26 #Python
Python实现的一个简单LRU cache
Sep 26 #Python
You might like
DC的38部超级英雄动画电影
2020/03/03 欧美动漫
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
2015/12/24 PHP
php文件上传 你真的掌握了吗
2016/11/28 PHP
PHP如何防止用户重复提交表单
2020/12/09 PHP
完整显示当前日期和时间的JS代码
2007/09/17 Javascript
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
关于JavaScript的面向对象和继承有利新手学习
2013/01/11 Javascript
js弹出div并显示遮罩层
2014/02/12 Javascript
原生javascript实现拖动元素示例代码
2014/09/01 Javascript
jQuery Ajax使用实例
2015/04/16 Javascript
js实现音频控制进度条功能
2017/04/01 Javascript
基于javascript的异步编程实例详解
2017/04/10 Javascript
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
Node.js学习教程之HTTP/2服务器推送【译】
2017/10/31 Javascript
基于JavaScript实现抽奖系统
2018/01/16 Javascript
学习jQuery中的noConflict()用法
2018/09/28 jQuery
通过实践编写优雅的JavaScript代码
2019/05/30 Javascript
15分钟上手vue3.0(小结)
2020/05/20 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
[01:19:46]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
使用Python的package机制如何简化utils包设计详解
2017/12/11 Python
python3+django2开发一个简单的人员管理系统过程详解
2019/07/23 Python
一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
2020/07/03 Python
python元组拆包实现方法
2021/02/28 Python
学生打架检讨书1000字
2014/01/16 职场文书
女儿十岁生日答谢词
2014/01/27 职场文书
小学班长竞选演讲稿
2014/04/24 职场文书
城市规划应届生推荐信
2014/09/08 职场文书
搞笑老公保证书
2015/02/26 职场文书
2015年敬老月活动总结
2015/03/27 职场文书
婚宴父母致辞
2015/07/27 职场文书
婚礼嘉宾致辞
2015/07/28 职场文书
公文写作:教你写“建议书”
2019/05/07 职场文书
创业计划书之婴幼儿游泳馆
2019/09/11 职场文书
MySQL系列之四 SQL语法
2021/07/02 MySQL
游戏《我的世界》澄清Xbox版暂无计划加入光追
2022/04/03 其他游戏