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进阶教程之词典、字典、dict
Aug 29 Python
python操作CouchDB的方法
Oct 08 Python
详解在Python和IPython中使用Docker
Apr 28 Python
Python中List.index()方法的使用教程
May 20 Python
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
Sep 18 Python
Python走楼梯问题解决方法示例
Jul 25 Python
python flask实现分页的示例代码
Aug 02 Python
对python3.4 字符串转16进制的实例详解
Jun 12 Python
Python用Try语句捕获异常的实例方法
Jun 26 Python
理解Django 中Call Stack机制的小Demo
Sep 01 Python
使用OpenCV校准鱼眼镜头的方法
Nov 26 Python
如何用python批量调整视频声音
Dec 22 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+javascript实现二级级联菜单的制作
2008/05/06 PHP
php中is_null,empty,isset,unset 的区别详细介绍
2013/04/28 PHP
基于php中使用excel的简单介绍
2013/08/02 PHP
php保存二进制原始数据为图片的程序代码
2014/10/14 PHP
php批量删除超链接的实现方法
2015/10/19 PHP
Mac下快速搭建PHP开发环境步骤详解
2019/05/05 PHP
Javascript &amp; DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例
2007/06/02 Javascript
摘自启点的main.js
2008/04/20 Javascript
ExtJs 表单提交登陆实现代码
2010/08/19 Javascript
extjs 分页使用jsp传递数据示例
2014/07/29 Javascript
什么是MEAN?JavaScript编程中的MEAN是什么意思?
2014/12/18 Javascript
SWFObject基本用法实例分析
2015/07/20 Javascript
微信企业号开发之微信考勤百度地图定位
2015/09/11 Javascript
原生JS:Date对象全面解析
2016/09/06 Javascript
JS中使用gulp实现压缩文件及浏览器热加载功能
2017/07/12 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
2017/08/10 Javascript
在HTML文档中嵌入JavaScript的四种方法
2018/05/07 Javascript
layui获取选中行数据的实例讲解
2018/08/19 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
WebPack工具运行原理及入门教程
2020/12/02 Javascript
[01:25:09]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第二场
2014/05/24 DOTA
在Linux命令行终端中使用python的简单方法(推荐)
2017/01/23 Python
Tensorflow 实现修改张量特定元素的值方法
2018/07/30 Python
Python批量修改图片分辨率的实例代码
2019/07/04 Python
Python tkinter三种布局实例详解
2020/01/06 Python
使用Pyhton 分析酒店针孔摄像头
2020/03/04 Python
python函数超时自动退出的实操方法
2020/12/28 Python
html5音频_动力节点Java学院整理
2018/08/22 HTML / CSS
Flesh Beauty官网:露华浓集团旗下彩妆品牌
2021/02/15 全球购物
什么是TCP/IP
2014/07/27 面试题
商务经理岗位职责
2014/08/03 职场文书
教师自我剖析材料(群众路线)
2014/09/29 职场文书
节约用电通知
2015/04/25 职场文书
民政局未婚证明
2015/06/15 职场文书
2015年小学师德师风建设工作总结
2015/10/23 职场文书
一文了解MySQL二级索引的查询过程
2022/02/24 MySQL