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 11 Python
python监控linux内存并写入mongodb(推荐)
Sep 11 Python
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
Nov 30 Python
简单实现python收发邮件功能
Jan 05 Python
python读取各种文件数据方法解析
Dec 29 Python
浅谈python之高阶函数和匿名函数
Mar 21 Python
python高斯分布概率密度函数的使用详解
Jul 10 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
Sep 26 Python
python生成器推导式用法简单示例
Oct 08 Python
python中with用法讲解
Feb 07 Python
Python接口自动化判断元素原理解析
Feb 24 Python
Django Admin 上传文件到七牛云的示例代码
Jun 20 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
PHP使用CURL实现多线程抓取网页
2015/04/30 PHP
最新版本PHP 7 vs HHVM 多角度比较
2016/02/14 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
表单元素事件 (Form Element Events)
2009/07/17 Javascript
文字溢出实现溢出的部分再放入一个新生成的div中具体代码
2013/05/17 Javascript
JQuery页面的表格数据的增加与分页的实现
2013/12/10 Javascript
JavaScript onkeydown事件入门实例(键盘某个按键被按下)
2014/10/17 Javascript
学习javascript面向对象 理解javascript原型和原型链
2016/01/04 Javascript
AngularJS 指令的交互详解及实例代码
2016/09/14 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
2016/09/20 Javascript
vuex实现简易计数器
2016/10/27 Javascript
JSON与JS对象的区别与对比
2017/03/01 Javascript
微信小程使用swiper组件实现图片轮播切换显示功能【附源码下载】
2017/12/12 Javascript
vue-cli项目优化方法- 缩短首屏加载时间
2018/04/01 Javascript
使用wxapp-img-loader自定义组件实现微信小程序图片预加载功能
2018/10/18 Javascript
vue 使用vue-i18n做全局中英文切换的方法
2018/10/29 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
2020/07/26 Javascript
实例讲解python函数式编程
2014/06/09 Python
使用python对文件中的单词进行提取的方法示例
2018/12/21 Python
在Django中预防CSRF攻击的操作
2020/03/13 Python
python写文件时覆盖原来的实例方法
2020/07/22 Python
浅析NumPy 切片和索引
2020/09/02 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
2020/10/29 Python
CSS3制作圆形滚动进度条动画的示例
2020/11/05 HTML / CSS
女孩每月服装订阅盒:kidpik
2019/04/17 全球购物
.NET面试10题
2014/02/24 面试题
介绍一下.NET构架下remoting和webservice
2014/05/08 面试题
药学专业毕业生求职信
2013/10/20 职场文书
教育课题研究自我鉴定范文
2013/12/28 职场文书
2014幼儿园教师师德师风演讲稿
2014/09/10 职场文书
解除同居协议书
2015/01/29 职场文书
士兵突击观后感
2015/06/16 职场文书
商务信函英语问候语
2015/11/10 职场文书
如何使用Python对NetCDF数据做空间相关分析
2021/04/21 Python
如何使用Python提取Chrome浏览器保存的密码
2021/06/09 Python
Oracle 多表查询基本语法实例
2022/04/18 Oracle