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类里的__init__方法函数,Python类的构造函数
Dec 10 Python
Bottle框架中的装饰器类和描述符应用详解
Oct 28 Python
python实现随机森林random forest的原理及方法
Dec 21 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
Apr 27 Python
Python装饰器原理与用法分析
Apr 30 Python
解决pandas使用read_csv()读取文件遇到的问题
Jun 15 Python
python range()函数取反序遍历sequence的方法
Jun 25 Python
Python (Win)readline和tab补全的安装方法
Aug 27 Python
Python 制作查询商品历史价格的小工具
Oct 20 Python
pycharm实现猜数游戏
Dec 07 Python
Python如何实现感知器的逻辑电路
Dec 25 Python
一劳永逸彻底解决pip install慢的办法
May 24 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
菜鸟学PHP之Smarty入门
2007/01/04 PHP
zen cart新进商品的随机排序修改方法
2010/09/10 PHP
网页上facebook分享功能具体实现
2014/01/26 PHP
php自定义函数实现统计中文字符串长度的方法小结
2017/04/15 PHP
Yii2数据库操作常用方法小结
2017/05/04 PHP
使用TextRange获取输入框中光标的位置的代码
2007/03/08 Javascript
jquery 实现的全选和反选
2009/04/15 Javascript
javascript 模拟JQuery的Ready方法实现并出现的问题
2009/12/06 Javascript
使用jQuery处理AJAX请求的基础学习教程
2016/05/10 Javascript
设计模式中的组合模式在JavaScript程序构建中的使用
2016/05/18 Javascript
JavaScript 判断对象中是否有某属性的常用方法
2018/06/14 Javascript
微信运维交互机器人的示例代码
2018/11/12 Javascript
简单的React SSR服务器渲染实现
2018/12/11 Javascript
详解vue中axios的使用与封装
2019/03/20 Javascript
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
2019/08/08 jQuery
vue项目中常见问题及解决方案(推荐)
2019/10/21 Javascript
使用Mock.js生成前端测试数据
2020/12/13 Javascript
[42:06]2019国际邀请赛全明星赛 8.23
2019/09/05 DOTA
Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】
2017/06/20 Python
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
python机器学习案例教程——K最近邻算法的实现
2017/12/28 Python
django 2.0更新的10条注意事项总结
2018/01/05 Python
python实现点对点聊天程序
2018/07/28 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
python issubclass 和 isinstance函数
2019/07/25 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
2020/02/05 Python
keras之权重初始化方式
2020/05/21 Python
pycharm2020.1.2永久破解激活教程,实测有效
2020/10/29 Python
用python计算文件的MD5值
2020/12/23 Python
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
深圳-东方伟业笔试部分
2015/02/11 面试题
nohup的用法
2012/11/26 面试题
python迷宫问题深度优先遍历实例
2021/06/20 Python
php去除数组中为0的元素的实例分析
2021/11/17 PHP
Java 死锁解决方案
2022/05/11 Java/Android
win10拖拽文件时崩溃怎么解决?win10文件不能拖拽问题解决方法
2022/08/14 数码科技