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读取注册表中值的方法
Apr 08 Python
python3使用urllib模块制作网络爬虫
Apr 08 Python
Python中遍历字典过程中更改元素导致异常的解决方法
May 12 Python
python中日志logging模块的性能及多进程详解
Jul 18 Python
Python实现mysql数据库更新表数据接口的功能
Nov 19 Python
python模仿网页版微信发送消息功能
Feb 24 Python
python2 与 python3 实现共存的方法
Jul 12 Python
win8下python3.4安装和环境配置图文教程
Jul 31 Python
python3 拼接字符串的7种方法
Sep 12 Python
Python 多线程不加锁分块读取文件的方法
Dec 11 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
Jun 04 Python
django settings.py 配置文件及介绍
Jul 15 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
收音机的保养
2021/03/01 无线电
PHP登录验证功能示例【用户名、密码、验证码、数据库、已登陆验证、自动登录和注销登录等】
2019/02/25 PHP
php实现JWT验证的实例教程
2020/11/26 PHP
使两个iframe的高度与内容自适应,且相等
2006/11/20 Javascript
jquery.pagination.js 无刷新分页实现步骤分享
2012/05/23 Javascript
jQuery动态地获取系统时间实现代码
2013/05/24 Javascript
判断iframe里的页面是否加载完成
2014/06/06 Javascript
jQuery $.each遍历对象、数组用法实例
2015/04/16 Javascript
jQuery实现鼠标经过购物车出现下拉框代码(推荐)
2016/07/21 Javascript
jQuery插件echarts实现的循环生成图效果示例【附demo源码下载】
2017/03/04 Javascript
vue单页应用中如何使用jquery的方法示例
2017/07/27 jQuery
JS简单添加元素新节点的方法示例
2018/02/10 Javascript
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
微信小程序实现文件、图片上传功能
2020/08/18 Javascript
jQuery 判断元素是否存在然后按需加载内容的实现代码
2020/01/16 jQuery
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
2020/01/26 Javascript
nodejs使用socket5进行代理请求的实现
2020/02/21 NodeJs
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
用Python和MD5实现网站挂马检测程序
2014/03/13 Python
Python检测一个对象是否为字符串类的方法
2015/05/21 Python
python 实时遍历日志文件
2016/04/12 Python
详解Python3迁移接口变化采坑记
2019/10/11 Python
使用python模拟高斯分布例子
2019/12/09 Python
python中的 zip函数详解及用法举例
2020/02/16 Python
python计算Content-MD5并获取文件的Content-MD5值方式
2020/04/03 Python
Python grpc超时机制代码示例
2020/09/14 Python
HTML5 中新的全局属性(整理)
2013/07/31 HTML / CSS
学习党的群众路线教育实践活动心得体会
2014/03/01 职场文书
学雷锋演讲稿汇总
2014/05/10 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
大学新闻系应届生求职信
2014/06/02 职场文书
建筑工程材料员岗位职责
2015/04/11 职场文书
党风廉政承诺书2016
2016/03/25 职场文书
导游词之云南丽江古城
2019/09/17 职场文书
2019年中学生的思想品德评语集锦
2019/12/19 职场文书
如何利用pygame实现打飞机小游戏
2021/05/30 Python