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 相关文章推荐
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
Jan 22 Python
python集合用法实例分析
May 30 Python
Python实现简单过滤文本段的方法
May 24 Python
Python中最大递归深度值的探讨
Mar 05 Python
简单了解python变量的作用域
Jul 30 Python
Python小程序 控制鼠标循环点击代码实例
Oct 08 Python
python实发邮件实例详解
Nov 11 Python
python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例
Mar 08 Python
Python多进程编程常用方法解析
Mar 26 Python
Pyinstaller加密打包应用的示例代码
Jun 11 Python
Python数据可视化实现漏斗图过程图解
Jul 20 Python
Python中异常处理用法
Nov 27 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
centos 5.6 升级php到5.3的方法
2011/05/14 PHP
使用php发送有附件的电子邮件-(PHPMailer使用的实例分析)
2013/04/26 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
PHP模拟http请求的方法详解
2016/11/09 PHP
JavaScript中window.open用法实例详解
2015/04/15 Javascript
js给selected添加options的方法
2015/05/06 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
JS简单实现仿百度控制台输出信息效果
2016/09/04 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
2016/11/07 Javascript
微信小程序 利用css实现遮罩效果实例详解
2017/01/21 Javascript
vue.js 微信支付前端代码分享
2018/02/10 Javascript
vue将对象新增的属性添加到检测序列的方法
2018/02/24 Javascript
vue动态设置img的src路径实例
2018/09/18 Javascript
Vue使用lodop实现打印小结
2019/07/06 Javascript
微信小程序封装分享与分销功能过程解析
2019/08/13 Javascript
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
2020/02/11 Javascript
JavaScript自定义超时API代码实例
2020/04/30 Javascript
微信小程序连接服务器展示MQTT数据信息的实现
2020/07/14 Javascript
Python中设置变量作为默认值时容易遇到的错误
2015/04/03 Python
Python中Django发送带图片和附件的邮件
2017/03/31 Python
Bottle框架中的装饰器类和描述符应用详解
2017/10/28 Python
python如何读写csv数据
2018/03/21 Python
Python初学者需要注意的事项小结(python2与python3)
2018/09/26 Python
python学生管理系统开发
2019/01/30 Python
python实现AES和RSA加解密的方法
2019/03/28 Python
基于python的列表list和集合set操作
2019/11/24 Python
Python如何输出警告信息
2020/07/30 Python
Python中Qslider控件实操详解
2021/02/20 Python
基于CSS3制作立体效果导航菜单
2016/01/12 HTML / CSS
纯html5+css3下拉导航菜单实现代码
2013/03/18 HTML / CSS
Talbots官网:美国成熟女装品牌
2019/11/15 全球购物
揭牌仪式策划方案
2014/05/28 职场文书
小学运动会口号
2014/06/07 职场文书
教师师德师风自我剖析材料
2014/09/29 职场文书
致运动员加油稿
2015/07/21 职场文书
Java比较两个对象中全部属性值是否相等的方法
2021/08/07 Java/Android