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 相关文章推荐
把MySQL表结构映射为Python中的对象的教程
Apr 07 Python
详解Swift中属性的声明与作用
Jun 30 Python
Windows下安装python MySQLdb遇到的问题及解决方法
Mar 16 Python
python操作MySQL 模拟简单银行转账操作
Sep 27 Python
python的构建工具setup.py的方法使用示例
Oct 23 Python
Django实现登录随机验证码的示例代码
Jun 20 Python
Flask框架踩坑之ajax跨域请求实现
Feb 22 Python
利用rest framework搭建Django API过程解析
Aug 31 Python
解决pytorch DataLoader num_workers出现的问题
Jan 14 Python
彻底搞懂 python 中文乱码问题(深入分析)
Feb 28 Python
Django 实现将图片转为Base64,然后使用json传输
Mar 27 Python
python 获取谷歌浏览器保存的密码
Jan 06 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 array_push 数组函数
2009/12/26 PHP
PHP禁止个别IP访问网站
2013/10/30 PHP
php判断ip黑名单程序代码实例
2014/02/24 PHP
php强制运行广告的方法
2014/12/01 PHP
C# WinForm中实现快捷键自定义设置实例
2015/01/23 PHP
php实现word转html的方法
2016/01/22 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
2016/07/18 PHP
jQuery的运行机制和设计理念分析
2011/04/05 Javascript
js验证整数加保留小数点的简单实例
2013/12/02 Javascript
js中array的sort()方法使用介绍
2014/02/20 Javascript
JavaScript运行时库属性一览表
2014/03/14 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
2014/06/26 Javascript
javascript中Array数组的迭代方法实例分析
2015/02/04 Javascript
浅析Node.js中的内存泄漏问题
2015/06/23 Javascript
javascript实现相同事件名称,不同命名空间的调用方法
2015/06/26 Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
2016/01/22 Javascript
如何清除IE10+ input X 文本框的叉叉和密码输入框的眼睛图标
2016/12/21 Javascript
Vue input控件通过value绑定动态属性及修饰符的方法
2017/05/03 Javascript
VUE实现一个分页组件的示例
2017/09/13 Javascript
微信小程序使用navigateTo数据传递的实例
2017/09/26 Javascript
解决Vue.js 2.0 有时双向绑定img src属性失败的问题
2018/03/14 Javascript
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
Python批量更改文件名的实现方法
2017/10/29 Python
python 重命名轴索引的方法
2018/11/10 Python
Python数据类型之String字符串实例详解
2019/05/08 Python
Python学习笔记之列表推导式实例分析
2019/08/13 Python
python将unicode和str互相转化的实现
2020/05/11 Python
Tensorflow之MNIST CNN实现并保存、加载模型
2020/06/17 Python
html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
2013/01/09 HTML / CSS
介绍一下MYSQL常用的优化技巧
2012/10/25 面试题
小区门卫岗位职责
2013/12/31 职场文书
双创工作实施方案
2014/03/26 职场文书
体育之星事迹材料
2014/05/11 职场文书
干部理论学习心得体会
2016/01/21 职场文书
员工工作失职检讨书范文!
2019/07/03 职场文书
Redis Cluster集群动态扩容的实现
2021/07/15 Redis