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文档生成工具pydoc使用介绍
Jun 02 Python
Python3调用微信企业号API发送文本消息代码示例
Nov 10 Python
Python向Excel中插入图片的简单实现方法
Apr 24 Python
通过python顺序修改文件名字的方法
Jul 11 Python
Python实现的简单线性回归算法实例分析
Dec 26 Python
Python提取支付宝和微信支付二维码的示例代码
Feb 15 Python
python读取图片的方式,以及将图片以三维数组的形式输出方法
Jul 03 Python
Python捕获异常堆栈信息的几种方法(小结)
May 18 Python
简单了解Python多态与属性运行原理
Jun 15 Python
django使用graphql的实例
Sep 02 Python
Pycharm github配置实现过程图解
Oct 13 Python
Python 文字识别
May 11 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
Zend Studio 实用快捷键一览表(精心整理)
2013/08/10 PHP
PHP语法自动检查的Vim插件
2014/08/11 PHP
PHP查找与搜索数组元素方法总结
2015/06/12 PHP
利用PHP如何实现Socket服务器
2015/09/23 PHP
php实现给一张图片加上水印效果
2016/01/02 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
PHP实现字符串大小写转函数的功能实例
2019/02/06 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
javascript 导出数据到Excel(处理table中的元素)
2009/12/18 Javascript
jQuery防止click双击多次提交及传递动态函数或多参数
2014/04/02 Javascript
使用jquery清空、复位整个输入域
2015/04/02 Javascript
AngularJS学习第一篇 AngularJS基础知识
2017/02/13 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
2017/04/01 Javascript
nodejs实现OAuth2.0授权服务认证
2017/12/27 NodeJs
JS 实现微信扫一扫功能
2018/09/14 Javascript
jQuery 获取除某指定对象外的其他对象 ( :not() 与.not())
2018/10/10 jQuery
手机浏览器唤起微信分享(JS)
2020/10/11 Javascript
Python中获取网页状态码的两个方法
2014/11/03 Python
Python函数式编程指南(三):迭代器详解
2015/06/24 Python
[原创]Python入门教程4. 元组基本操作
2018/10/31 Python
Python 中包/模块的 `import` 操作代码
2019/04/22 Python
python爬虫实现中英翻译词典
2019/06/25 Python
python代理工具mitmproxy使用指南
2019/07/04 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
详解HTML5 Canvas绘制不规则图形时的非零环绕原则
2016/03/21 HTML / CSS
使用canvas压缩图片大小的方法示例
2019/08/02 HTML / CSS
美国床垫和床上用品公司:Nest Bedding
2017/06/12 全球购物
Notino罗马尼亚网站:购买香水和化妆品
2019/07/20 全球购物
写自荐信的七个技巧
2013/10/15 职场文书
《雾凇》教学反思
2014/02/17 职场文书
政府采购方案
2014/06/12 职场文书
市场策划求职信
2014/08/07 职场文书
微笑面对生活演讲稿
2014/09/23 职场文书
干部理论学习心得体会
2016/01/21 职场文书
高一英语教学反思
2016/03/03 职场文书
MySQL学习之基础操作总结
2022/03/19 MySQL