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编写脚本使IE实现代理上网的教程
Apr 23 Python
简单介绍Python的Tornado框架中的协程异步实现原理
Apr 23 Python
python 计算两个日期相差多少个月实例代码
May 24 Python
Python分治法定义与应用实例详解
Jul 28 Python
放弃 Python 转向 Go语言有人给出了 9 大理由
Oct 20 Python
Python代码实现KNN算法
Dec 20 Python
Python基于多线程实现ping扫描功能示例
Jul 23 Python
django进阶之cookie和session的使用示例
Aug 17 Python
python cumsum函数的具体使用
Jul 29 Python
Python 使用元类type创建类对象常见应用详解
Oct 17 Python
python安装后的目录在哪里
Jun 21 Python
解决pytorch 模型复制的一些问题
Mar 03 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 json与xml序列化/反序列化
2013/10/28 PHP
ThinkPHP查询语句与关联查询用法实例
2014/11/01 PHP
使用PHP编写发红包程序
2015/07/22 PHP
php给图片加文字水印
2015/07/31 PHP
常见PHP数据库解决方案分析介绍
2015/09/24 PHP
PHP面向对象自动加载机制原理与用法分析
2016/10/14 PHP
用js计算页面执行时间的函数
2006/12/07 Javascript
myFocus slide3D v1.1.0 使用方法与下载
2011/01/12 Javascript
Textbox控件注册回车事件及触发按钮提交事件具体实现
2013/03/04 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
2013/11/22 Javascript
JS获取当前日期时间并定时刷新示例
2021/03/04 Javascript
javascript实现时间格式输出FormatDate函数
2015/01/13 Javascript
jQuery.each使用详解
2015/07/07 Javascript
深入理解JS正则表达式---分组
2016/07/18 Javascript
JQuery学习总结【一】
2016/12/01 Javascript
Vue.js bootstrap前端实现分页和排序
2017/03/10 Javascript
Angular实现的进度条功能示例
2018/02/18 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
在element-ui的el-tree组件中用render函数生成el-button的实例代码
2018/11/05 Javascript
mock.js实现模拟生成假数据功能示例
2019/01/15 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
2019/10/28 Javascript
5分钟快速看懂ES6中的反射与代理
2019/12/19 Javascript
[04:03][TI9趣味短片] 小鸽子茶话会
2019/08/20 DOTA
python获取指定字符串中重复模式最高的字符串方法
2018/06/29 Python
对Pyhon实现静态变量全局变量的方法详解
2019/01/11 Python
python实现转盘效果 python实现轮盘抽奖游戏
2019/01/22 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
从numpy数组中取出满足条件的元素示例
2019/11/26 Python
mac使用python识别图形验证码功能
2020/01/10 Python
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
2016/04/26 HTML / CSS
我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
2014/03/30 面试题
自学考试自我鉴定范文
2013/09/26 职场文书
汽车维修工岗位职责
2014/02/12 职场文书
交通事故赔偿协议书范本
2014/04/15 职场文书
毕业生代领毕业材料的授权委托书
2014/09/29 职场文书
15个值得收藏的JavaScript函数
2021/09/15 Javascript