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中使用PIL模块对图片进行高斯模糊处理的教程
May 05 Python
python 去除txt文本中的空格、数字、特定字母等方法
Jul 24 Python
Python rstrip()方法实例详解
Nov 11 Python
Python Django框架单元测试之文件上传测试示例
May 17 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
Oct 18 Python
python数值基础知识浅析
Nov 19 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
Feb 11 Python
python时间与Unix时间戳相互转换方法详解
Feb 13 Python
django中related_name的用法说明
May 20 Python
pycharm设置默认的UTF-8编码模式的方法详解
Jun 01 Python
Python可变集合和不可变集合的构造方法大全
Dec 06 Python
Python中非常使用的6种基本变量的操作与技巧
Mar 22 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访问MySql数据库的逻辑操作以及增删改查的实例讲解
2017/08/30 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
PHP赋值的内部是如何跑的详解
2019/01/13 PHP
php进程(线程)通信基础之System V共享内存简单实例分析
2019/11/09 PHP
javascript offsetX与layerX区别
2010/03/12 Javascript
说明你的Javascript技术很烂的五个原因
2011/04/26 Javascript
自己动手开发jQuery插件教程
2011/08/25 Javascript
javascript针对DOM的应用分析(三)
2012/04/15 Javascript
JSuggest自动匹配下拉框使用方法(示例代码)
2013/12/27 Javascript
详细解密jsonp跨域请求
2015/04/15 Javascript
使用JQuery 加载页面时调用JS的实现方法
2016/05/30 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
2016/09/18 Javascript
AngularJS入门教程之与服务器(Ajax)交互操作示例【附完整demo源码下载】
2016/11/02 Javascript
jQuery内容筛选选择器实例代码
2017/02/06 Javascript
javaScript 逻辑运算符使用技巧整理
2017/05/03 Javascript
js实现动态改变radio状态的方法
2018/02/28 Javascript
VueCli3.0中集成MockApi的方法示例
2019/07/05 Javascript
vue 修改 data 数据问题并实时显示操作
2020/09/07 Javascript
[00:50]2014DOTA2国际邀请赛 NEWBEE战队回顾
2014/08/01 DOTA
python实现遍历文件夹修改文件后缀
2018/08/28 Python
python实现批量nii文件转换为png图像
2019/07/18 Python
pytorch 模型可视化的例子
2019/08/17 Python
Python+OpenCv制作证件图片生成器的操作方法
2019/08/21 Python
10个很棒的 CSS3 开发工具 推荐
2011/05/16 HTML / CSS
CSS3实现水平居中、垂直居中、水平垂直居中的实例代码
2020/02/27 HTML / CSS
YSL圣罗兰美妆英国官网:Yves Saint Laurent Beauty UK
2019/08/03 全球购物
Farfetch巴西官网:奢侈品牌时尚购物平台
2020/10/19 全球购物
经济信息系毕业生自荐信
2014/06/02 职场文书
食品质量与安全专业毕业生求职信
2014/08/11 职场文书
2014年四风问题自我剖析材料
2014/09/15 职场文书
拿破仑传读书笔记
2015/07/01 职场文书
安全教育主题班会总结
2015/08/14 职场文书
小学体育跳绳课教学反思
2016/02/16 职场文书
详解Redis基本命令与使用场景
2021/06/01 Redis
java实现对Hadoop的操作
2021/07/01 Java/Android