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获得时间的实例说明
Mar 25 Python
Python遍历目录的4种方法实例介绍
Apr 13 Python
Python实现处理管道的方法
Jun 04 Python
Python函数返回值实例分析
Jun 08 Python
python实现简单爬虫功能的示例
Oct 24 Python
python实现杨辉三角思路
Jul 14 Python
Python重新加载模块的实现方法
Oct 16 Python
Python实现使用request模块下载图片demo示例
May 24 Python
python实现ip代理池功能示例
Jul 05 Python
解决Python数据可视化中文部分显示方块问题
May 16 Python
python时间time模块处理大全
Oct 25 Python
使用Python爬取小姐姐图片(beautifulsoup法)
Feb 11 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
全国FM电台频率大全 - 4 山西省
2020/03/11 无线电
php array_merge下进行数组合并的代码
2008/07/22 PHP
关于PHP5 Session生命周期介绍
2010/03/02 PHP
PHP goto语句简介和使用实例
2014/03/11 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
Smarty模板变量与调节器实例详解
2019/07/20 PHP
javascript获取所有同类checkbox选项(实例代码)
2013/11/07 Javascript
javascript实现C语言经典程序题
2015/11/29 Javascript
jQuery基于ajax()使用serialize()提交form数据的方法
2015/12/08 Javascript
利用AJAX实现WordPress中的文章列表及评论的分页功能
2016/05/17 Javascript
javascript设计模式之模块模式学习笔记
2017/02/15 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
2017/05/17 Javascript
详解如何优雅地在React项目中使用Redux
2017/12/28 Javascript
vue项目部署上线遇到的问题及解决方法
2018/06/10 Javascript
vue相关配置文件详解及多环境配置详细步骤
2020/05/19 Javascript
python 查找文件夹下所有文件 实现代码
2009/07/01 Python
深入理解python中的atexit模块
2017/03/07 Python
对python中的xlsxwriter库简单分析
2018/05/04 Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
2018/12/19 Python
scrapy-redis的安装部署步骤讲解
2019/02/27 Python
python使用mitmproxy抓取浏览器请求的方法
2019/07/02 Python
用Python解数独的方法示例
2019/10/24 Python
用Python开发app后端有优势吗
2020/06/29 Python
Python requests接口测试实现代码
2020/09/08 Python
python向企业微信发送文字和图片消息的示例
2020/09/28 Python
python实现学生通讯录管理系统
2021/02/25 Python
中国首家奢侈品O2O网购平台:第五大道奢侈品网
2017/12/14 全球购物
本科生的职业生涯规划范文
2014/01/09 职场文书
主题教育活动总结
2014/05/05 职场文书
六一儿童节活动总结
2014/08/27 职场文书
学校捐书活动总结
2015/05/08 职场文书
2015年党务工作者个人工作总结
2015/10/22 职场文书
团支部书记竞选稿
2015/11/21 职场文书
jQuery实现广告显示和隐藏动画
2021/07/04 jQuery
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android
「租借女友」第2季樱泽墨角色PV&新视觉图公开
2022/03/21 日漫