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 19 Python
python中查看变量内存地址的方法
May 05 Python
Python通过RabbitMQ服务器实现交换机功能的实例教程
Jun 29 Python
zookeeper python接口实例详解
Jan 18 Python
Python subprocess模块功能与常见用法实例详解
Jun 28 Python
numpy向空的二维数组中添加元素的方法
Nov 01 Python
Python静态类型检查新工具之pyright 使用指南
Apr 26 Python
wxpython实现按钮切换界面的方法
Nov 19 Python
Python使用Socket实现简单聊天程序
Feb 28 Python
Python描述符descriptor使用原理解析
Mar 21 Python
Windows下Anaconda安装、换源与更新的方法
Apr 17 Python
拒绝盗图!教你怎么用python给图片加水印
Jun 04 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中获取主机名、协议及IP地址的方法
2014/11/18 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
PHP如何根据文件头检测文件类型实例代码
2018/10/14 PHP
validator验证控件使用代码
2010/11/23 Javascript
解决js下referer兼容各大浏览器的方法
2014/11/03 Javascript
jQuery+ajax实现滚动到页面底部自动加载图文列表效果(类似图片懒加载)
2016/06/07 Javascript
JS 面向对象之继承---多种组合继承详解
2016/07/10 Javascript
超全面的vue.js使用总结
2017/02/12 Javascript
node.js实现登录注册页面
2017/04/08 Javascript
JS实现简单的星期格式转换功能示例
2018/07/23 Javascript
微信小程序开发之转发分享功能
2019/10/22 Javascript
使用node.JS中的url模块解析URL信息
2020/02/06 Javascript
antd table按表格里的日期去排序操作
2020/11/17 Javascript
详细介绍Python语言中的按位运算符
2013/11/26 Python
使用python编写批量卸载手机中安装的android应用脚本
2014/07/21 Python
python类继承用法实例分析
2015/05/27 Python
详解Django框架中用context来解析模板的方法
2015/07/20 Python
Eclipse和PyDev搭建完美Python开发环境教程(Windows篇)
2016/11/16 Python
python中redis的安装和使用
2016/12/04 Python
Python标准库之itertools库的使用方法
2017/09/07 Python
Python语言描述机器学习之Logistic回归算法
2017/12/21 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
python绘制直方图和密度图的实例
2019/07/08 Python
Python 点击指定位置验证码破解的实现代码
2019/09/11 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
2020/01/25 Python
Python如何访问字符串中的值
2020/02/09 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
2020/02/27 Python
Python判断变量是否是None写法代码实例
2020/10/09 Python
CSS3中的transform属性进行2D和3D变换的基本用法
2016/05/12 HTML / CSS
欧舒丹加拿大官网:L’Occitane加拿大
2017/10/29 全球购物
飞利浦美国官网:Philips美国
2020/02/28 全球购物
Java多态性的定义以及类型
2014/09/16 面试题
大学生毕业求职自荐书范文
2014/02/04 职场文书
改作风抓落实促发展心得体会
2014/09/10 职场文书
优秀班集体事迹材料
2014/12/25 职场文书
小学信息技术教学反思
2016/02/16 职场文书