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的id()函数介绍
Feb 10 Python
2款Python内存检测工具介绍和使用方法
Jun 01 Python
Python解析xml中dom元素的方法
Mar 12 Python
Python中设置变量访问权限的方法
Apr 27 Python
在Django中创建URLconf相关的通用视图的方法
Jul 20 Python
python爬虫实战之最简单的网页爬虫教程
Aug 13 Python
Python实现定时精度可调节的定时器
Apr 15 Python
在pycharm中设置显示行数的方法
Jan 16 Python
Python 获取windows桌面路径的5种方法小结
Jul 15 Python
Python中Subprocess的不同函数解析
Dec 10 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
Jul 31 Python
Python 下载Bing壁纸的示例
Sep 29 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
header中Content-Disposition的作用与使用方法
2012/06/13 PHP
简单实用的网站PHP缓存类实例
2014/07/18 PHP
php实现的简单数据库操作Model类
2016/11/16 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
PHP获取访问设备信息的方法示例
2019/02/20 PHP
JS 跳转页面延迟2种方法
2013/03/29 Javascript
验证手机号码的JS方法分享
2013/09/10 Javascript
js实现有时间限制消失的图片方法
2015/02/27 Javascript
使用postMesssage()实现iframe跨域页面间的信息传递
2016/03/29 Javascript
自带气泡提示的vue校验插件(vue-verify-pop)
2017/04/07 Javascript
JavaScript实现简单的四则运算计算器完整实例
2017/04/28 Javascript
JavaScript判断数组类型的方法
2019/10/23 Javascript
vue中的使用token的方法示例
2020/03/10 Javascript
python获得图片base64编码示例
2014/01/16 Python
Python对象体系深入分析
2014/10/28 Python
python单例模式实例分析
2015/04/08 Python
详解Python中的Cookie模块使用
2015/07/06 Python
Python使用设计模式中的责任链模式与迭代器模式的示例
2016/03/02 Python
详解Python的Flask框架中的signals信号机制
2016/06/13 Python
python学习教程之使用py2exe打包
2017/09/24 Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
2018/06/14 Python
关于Pycharm无法debug问题的总结
2019/01/19 Python
python获取地震信息 微信实时推送
2019/06/18 Python
numpy数组广播的机制
2019/07/12 Python
python orm 框架中sqlalchemy用法实例详解
2020/02/02 Python
解决jupyter notebook 前面书写后面内容消失的问题
2020/04/13 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
python时间序列数据转为timestamp格式的方法
2020/08/03 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
2021/03/04 Python
毕业生求职的求职信
2013/12/05 职场文书
成本会计实训报告
2014/11/05 职场文书
保密工作整改报告
2014/11/06 职场文书
2015年教师新年寄语
2014/12/08 职场文书
辩论会主持词
2015/07/03 职场文书
2016年优秀共青团员事迹材料
2016/02/25 职场文书
Golang bufio详细讲解
2022/04/21 Golang