Python多继承原理与用法示例


Posted in Python onAugust 23, 2018

本文实例讲述了Python多继承原理与用法。分享给大家供大家参考,具体如下:

python中使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承,也叫菱形继承问题)等

MRO

MRO即method resolution order,用于判断子类调用的属性来自于哪个父类。在Python2.3之前,MRO是基于深度优先算法的,自2.3开始使用C3算法,定义类时需要继承object,这样的类称为新式类,否则为旧式类

从图中可以看出,旧式类查找属性时是深度优先搜索,新式类则是广度优先搜索

Python多继承原理与用法示例

C3算法最早被提出是用于Lisp的,应用在Python中是为了解决原来基于深度优先搜索算法不满足本地优先级,和单调性的问题。

本地优先级:指声明时父类的顺序,比如C(A,B),如果访问C类对象属性时,应该根据声明顺序,优先查找A类,然后再查找B类。

单调性:如果在C的解析顺序中,A排在B的前面,那么在C的所有子类里,也必须满足这个顺序

示例

看下面的例子

# -*- coding:utf-8 -*-
#!python2
class X(object):
  def f(self):
    print 'x'
class A(X):
  def f(self):
    print 'a'
def extral(self):
    print 'extral a'
class B(X):
  def f(self):
    print 'b'
  def extral(self):
    print 'extral b'
class C(A, B, X):
  def f(self):
    super(C, self).f()
    print 'c'
print C.mro()
c = C()
c.f()
c.extral()

根据广度搜索原则最先搜索到A,所以结果很明显,如下所示

[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.X'>, <type 'object'>]
a
c
extral b

类C没有extral函数,调用的是子类的该函数。这种类的部分行为由父类来提供的行为,叫做抽象超类.

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
利用Python如何生成随机密码
Apr 20 Python
Centos7 Python3下安装scrapy的详细步骤
Mar 15 Python
使用Python设计一个代码统计工具
Apr 04 Python
Python中将dataframe转换为字典的实例
Apr 13 Python
Django 浅谈根据配置生成SQL语句的问题
May 29 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
Jul 25 Python
解决python ogr shp字段写入中文乱码的问题
Dec 31 Python
Flask框架学习笔记之使用Flask实现表单开发详解
Aug 12 Python
python实现机器人卡牌
Oct 06 Python
python中with语句结合上下文管理器操作详解
Dec 19 Python
GDAL 矢量属性数据修改方式(python)
Mar 10 Python
详解KMP算法以及python如何实现
Sep 18 Python
Python抽象和自定义类定义与用法示例
Aug 23 #Python
Python引用计数操作示例
Aug 23 #Python
python实现括号匹配的思路详解
Aug 23 #Python
使用Python实现一个栈判断括号是否平衡
Aug 23 #Python
Python wxpython模块响应鼠标拖动事件操作示例
Aug 23 #Python
示例详解Python3 or Python2 两者之间的差异
Aug 23 #Python
Django 限制用户访问频率的中间件的实现
Aug 23 #Python
You might like
PHP+MYSQL的文章管理系统(一)
2006/10/09 PHP
PHP5中新增stdClass 内部保留类
2011/06/13 PHP
php实现网站文件批量压缩下载功能
2015/10/28 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
JavaScript方法和技巧大全
2006/12/27 Javascript
JavaScript Tips 使用DocumentFragment加快DOM渲染速度
2010/06/28 Javascript
Js 获取Gridview选中行的内容操作步骤
2013/02/05 Javascript
JS实现向表格中动态添加行的方法
2015/03/30 Javascript
使用jquery清空、复位整个输入域
2015/04/02 Javascript
jQuery实现气球弹出框式的侧边导航菜单效果
2015/09/22 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
2017/01/06 Javascript
js实现省份下拉菜单效果
2017/02/15 Javascript
详解使用PM2管理nodejs进程
2017/10/24 NodeJs
webpack引入eslint配置详解
2018/01/22 Javascript
浅谈vue父子组件怎么传值
2018/07/21 Javascript
支付宝小程序自定义弹窗dialog插件的实现代码
2018/11/30 Javascript
详解js根据百度地图提供经纬度计算两点距离
2019/05/13 Javascript
JavaScript常用内置对象用法分析
2019/07/09 Javascript
Python工程师面试必备25条知识点
2018/01/17 Python
python3+PyQt5实现柱状图
2018/04/24 Python
python用户评论标签匹配的解决方法
2018/05/31 Python
Python实现基于PIL和tesseract的验证码识别功能示例
2018/07/11 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
2018/12/10 Python
python打开windows应用程序的实例
2019/06/28 Python
基于Python的ModbusTCP客户端实现详解
2019/07/13 Python
Python分析最近大火的网剧《隐秘的角落》
2020/07/02 Python
英国最大的婴儿监视器网上商店:Baby Monitors Direct
2018/04/24 全球购物
BSTN意大利:德国街头和运动文化高品质商店
2020/12/22 全球购物
计算机专业自我鉴定
2013/10/15 职场文书
手术室护士节演讲稿
2014/08/27 职场文书
优秀团员个人总结
2015/02/26 职场文书
校长师德表现自我评价
2015/03/04 职场文书
自我推荐信怎么写
2015/03/24 职场文书
2015年入党积极分子评语
2015/03/26 职场文书
2019年描写人生经典诗句大全
2019/07/08 职场文书
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript