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线程锁(thread)学习示例
Dec 04 Python
在Python中使用判断语句和循环的教程
Apr 25 Python
给Python中的MySQLdb模块添加超时功能的教程
May 05 Python
Python数组定义方法
Apr 13 Python
Python使用cookielib模块操作cookie的实例教程
Jul 12 Python
Python判断变量是否为Json格式的字符串示例
May 03 Python
Python3 中文文件读写方法
Jan 23 Python
python破解zip加密文件的方法
May 31 Python
Python数据抓取爬虫代理防封IP方法
Dec 23 Python
python实现XML解析的方法解析
Nov 16 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
Apr 02 Python
Python求凸包及多边形面积教程
Apr 12 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中is_null,empty,isset,unset 的区别详细介绍
2013/04/28 PHP
一个PHP二维数组排序的函数分享
2014/01/17 PHP
适用于抽奖程序、随机广告的PHP概率算法实例
2014/04/09 PHP
PHP中十六进制颜色与RGB颜色值互转的方法
2019/03/18 PHP
RSA实现JS前端加密与PHP后端解密功能示例
2019/08/05 PHP
YII2框架中日志的配置与使用方法实例分析
2020/03/18 PHP
JavaScript控制table某列不显示的方法
2015/03/16 Javascript
微信小程序动态显示项目倒计时效果
2017/06/13 Javascript
基于JS实现仿京东搜索栏随滑动透明度渐变效果
2017/07/10 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
2018/12/28 Javascript
Angular中使用ng-zorro图标库部分图标不能正常显示问题
2019/04/22 Javascript
layui点击数据表格添加或删除一行的例子
2019/09/12 Javascript
使用VScode 插件debugger for chrome 调试react源码的方法
2019/09/13 Javascript
vue 微信扫码登录(自定义样式)
2020/01/06 Javascript
python基础教程之简单入门说明(变量和控制语言使用方法)
2014/03/25 Python
Python中使用动态变量名的方法
2014/05/06 Python
Python中的引用和拷贝浅析
2014/11/22 Python
Python加pyGame实现的简单拼图游戏实例
2015/05/15 Python
python读取和保存视频文件
2018/04/16 Python
python中从str中提取元素到list以及将list转换为str的方法
2018/06/26 Python
Python编程flask使用页面模版的方法
2018/12/28 Python
杭州信雅达系统.NET工程师面试试题
2015/02/08 面试题
高中毕业生自我鉴定
2013/11/03 职场文书
财务管理职业生涯规划范文
2013/12/27 职场文书
国贸专业个人求职信范文
2014/01/08 职场文书
生物学学生自我评价
2014/01/17 职场文书
九年级数学教学反思
2014/02/02 职场文书
药品促销活动方案
2014/02/14 职场文书
《雪地里的小画家》教学反思
2014/02/22 职场文书
房地产项目建议书
2014/03/12 职场文书
经贸专业毕业生求职信
2014/03/23 职场文书
高中升旗仪式演讲稿
2014/09/09 职场文书
1000字打架检讨书
2014/11/03 职场文书
离婚协议书范文
2015/01/26 职场文书
PyQt5 显示超清高分辨率图片的方法
2021/04/11 Python
Elasticsearch Recovery 详细介绍
2022/04/19 Java/Android