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实现自定义顺序、排列写入数据到Excel的方法
Apr 23 Python
Python异常处理操作实例详解
May 10 Python
Python使用pandas处理CSV文件的实例讲解
Jun 22 Python
Python实现基于KNN算法的笔迹识别功能详解
Jul 09 Python
举例讲解Python常用模块
Mar 08 Python
django的settings中设置中文支持的实现
Apr 28 Python
对python while循环和双重循环的实例详解
Aug 23 Python
python接口自动化之ConfigParser配置文件的使用详解
Aug 03 Python
python 读取串口数据的示例
Nov 09 Python
Python如何使用logging为Flask增加logid
Mar 30 Python
Python编程源码报错解决方法总结经验分享
Oct 05 Python
Python 中的 copy()和deepcopy()
Nov 07 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
模仿OSO的论坛(二)
2006/10/09 PHP
php 代码优化之经典示例
2011/03/24 PHP
PHP中array_keys和array_unique函数源码的分析
2016/02/26 PHP
Laravel 5.3 学习笔记之 配置
2016/08/28 PHP
PHP基本语法实例总结
2016/09/09 PHP
Jquery 高亮显示文本中重要的关键字
2009/12/24 Javascript
Javascript 匿名函数及其代码模式原理
2010/03/19 Javascript
javascript随机之洗牌算法深入分析
2014/06/07 Javascript
javascript实现对表格元素进行排序操作
2015/11/18 Javascript
jquery跟随屏幕滚动效果的实现代码
2016/04/13 Javascript
JS前端加密算法示例
2016/12/22 Javascript
js判断iframe中元素是否存在的实现代码
2016/12/24 Javascript
Node.js学习之TCP/IP数据通讯(实例讲解)
2017/10/11 Javascript
JavaScript中使用import 和require打包后实现原理分析
2018/03/07 Javascript
对vux点击事件的优化详解
2018/08/28 Javascript
简单了解JavaScript异步
2019/05/23 Javascript
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
Element-Ui组件 NavMenu 导航菜单的具体使用
2019/10/24 Javascript
如何在微信小程序中使用骨架屏的步骤
2020/06/12 Javascript
在elementui中Notification组件添加点击事件实例
2020/11/11 Javascript
[49:17]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第三场 1月26日
2021/03/11 DOTA
python模块restful使用方法实例
2013/12/10 Python
Python中read()、readline()和readlines()三者间的区别和用法
2017/07/30 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
python用opencv批量截取图像指定区域的方法
2019/01/24 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
python删除指定列或多列单个或多个内容实例
2020/06/28 Python
美国开幕式潮店:Opening Ceremony
2018/02/10 全球购物
与世界上最好的跑步专业品牌合作:Fleet Feet
2019/03/22 全球购物
为您的家、后院、车库等在线购物:Spreetail
2019/06/17 全球购物
台湾三立电视电商平台:电电购
2019/09/09 全球购物
质检员的岗位职责
2013/11/15 职场文书
办公自动化专业大学生职业规划书
2014/03/06 职场文书
2014基层党员干部学习全国两会心得体会
2014/03/17 职场文书
春节慰问信范文
2015/02/15 职场文书
导游词创作书写原则以及开场白技巧怎么学?
2019/09/25 职场文书