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自动化测试工具Splinter简介和使用实例
May 13 Python
Python创建系统目录的方法
Mar 11 Python
python实现中文转换url编码的方法
Jun 14 Python
python爬虫获取多页天涯帖子
Feb 23 Python
Python脚本完成post接口测试的实例
Dec 17 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
Mar 14 Python
python爬虫项目设置一个中断重连的程序的实现
Jul 26 Python
Python PIL图片添加字体的例子
Aug 22 Python
基于Python中的yield表达式介绍
Nov 19 Python
pytorch 实现cross entropy损失函数计算方式
Jan 02 Python
Python多个装饰器的调用顺序实例解析
May 22 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
Jun 10 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
德劲1103二次变频版的打磨
2021/03/02 无线电
经典的PHPer为什么被认为是草根?
2007/04/02 PHP
批量去除PHP文件中bom的PHP代码
2012/03/13 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
javascript removeChild 使用注意事项
2009/04/11 Javascript
百度留言本js 大家可以参考下
2009/10/13 Javascript
js自定义事件代码说明
2011/01/31 Javascript
jQuery EasyUI API 中文文档 DateTimeBox日期时间框
2011/10/16 Javascript
jQuery新的事件绑定机制on()示例应用
2014/07/18 Javascript
初识Javascript小结
2015/07/16 Javascript
js实现自动轮换选项卡
2017/01/13 Javascript
angular实现IM聊天图片发送实例
2017/05/08 Javascript
浅谈通过JS拦截 pushState和replaceState事件
2017/07/21 Javascript
Vue项目中跨域问题解决方案
2018/06/05 Javascript
微信小程序实现左滑修改、删除功能
2020/10/19 Javascript
Vue实现表格批量审核功能实例代码
2019/05/28 Javascript
微信小程序自定义组件实现环形进度条
2020/11/17 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
用Python中的字典来处理索引统计的方法
2015/05/05 Python
使用Python脚本生成随机IP的简单方法
2015/07/30 Python
解决python3 requests headers参数不能有中文的问题
2019/08/21 Python
Python自动化测试中yaml文件读取操作
2020/08/20 Python
Python第三方库安装缓慢的解决方法
2021/02/06 Python
HTML5 Canvas的事件处理介绍
2015/04/24 HTML / CSS
详解前端HTML5几种存储方式的总结
2016/12/27 HTML / CSS
Html5导航栏吸顶方案原理与对比实现
2020/06/10 HTML / CSS
美国克罗格超市在线购物:Kroger
2019/06/21 全球购物
乌克兰在线电子产品商店:MTA
2019/11/14 全球购物
企业管理毕业生求职信范文
2014/03/07 职场文书
《故都的秋》教学反思
2014/04/15 职场文书
学生安全责任书模板
2014/07/25 职场文书
五一劳动节演讲稿
2014/09/12 职场文书
让人感觉高大上的讲话稿怎么写?
2019/07/08 职场文书
详解CSS玩转图片Base64编码
2021/05/25 HTML / CSS
python游戏开发Pygame框架
2022/04/22 Python
CentOS7 minimal 最小化安装网络设置过程
2022/12/24 Servers