python的多重继承的理解


Posted in Python onAugust 06, 2017

python的多重继承的理解

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 相关文章推荐
在Python的Django框架中生成CSV文件的方法
Jul 22 Python
Python中基础的socket编程实战攻略
Jun 01 Python
Python实现句子翻译功能
Nov 14 Python
Python使用OpenCV进行标定
May 08 Python
tensorflow学习教程之文本分类详析
Aug 07 Python
Python中的CSV文件使用&quot;with&quot;语句的方式详解
Oct 16 Python
用Python实现校园通知更新提醒功能
Nov 23 Python
Python基于requests库爬取网站信息
Mar 02 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
Mar 27 Python
Python使用configparser读取ini配置文件
May 25 Python
Python代码中如何读取键盘录入的值
May 27 Python
使用Python解析Chrome浏览器书签的示例
Nov 13 Python
python中 chr unichr ord函数的实例详解
Aug 06 #Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
Aug 05 #Python
Python实现将Excel转换为json的方法示例
Aug 05 #Python
Python实现抓取网页生成Excel文件的方法示例
Aug 05 #Python
Python基于Socket实现的简单聊天程序示例
Aug 05 #Python
Python Socket实现简单TCP Server/client功能示例
Aug 05 #Python
对pandas的dataframe绘图并保存的实现方法
Aug 05 #Python
You might like
PHP5在Apache下的两种模式的安装
2006/09/05 PHP
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
2012/07/23 PHP
php随机显示指定文件夹下图片的方法
2015/07/13 PHP
JavaScript实现班级随机点名小应用需求的具体分析
2014/05/12 Javascript
javascript实现复选框选中属性
2015/03/25 Javascript
JSON键值对序列化和反序列化解析
2017/01/24 Javascript
用angular实现多选按钮的全选与反选实例代码
2017/05/23 Javascript
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
vue通过路由实现页面刷新的方法
2018/01/25 Javascript
详解从买域名到使用pm2部署node.js项目全过程
2018/03/07 Javascript
使用elementUI实现将图片上传到本地的示例
2018/09/04 Javascript
Express结合Webpack的全栈自动刷新
2019/05/23 Javascript
javascript绘制简单钟表效果
2020/04/07 Javascript
[00:28]DOTA2北京网鱼队选拔赛
2015/04/08 DOTA
简单介绍Python中的filter和lambda函数的使用
2015/04/07 Python
python抓取网页中图片并保存到本地
2015/12/01 Python
Python实现包含min函数的栈
2016/04/29 Python
python日志记录模块实例及改进
2017/02/12 Python
python shell根据ip获取主机名代码示例
2017/11/25 Python
selenium获取当前页面的url、源码、title的方法
2019/06/12 Python
简单了解python的内存管理机制
2019/07/08 Python
Django rstful登陆认证并检查session是否过期代码实例
2019/08/13 Python
python+tkinter实现学生管理系统
2019/08/20 Python
Python 如何测试文件是否存在
2020/07/31 Python
adidas美国官网:adidas US
2016/09/21 全球购物
Maison Lab荷兰:名牌Outlet购物
2018/08/10 全球购物
超市5.1促销活动
2014/01/15 职场文书
党员领导干部廉洁从政承诺书
2014/03/27 职场文书
我爱我家教学反思
2014/05/01 职场文书
教代会闭幕词
2015/01/28 职场文书
回复函格式及范文
2015/07/14 职场文书
2016年教师节感恩寄语
2015/12/04 职场文书
解决golang post文件时Content-Type出现的问题
2021/05/02 Golang
Java基础——Map集合
2022/04/01 Java/Android
CSS SandBox应用场景及常见问题
2022/06/25 HTML / CSS
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers