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 Web框架Flask中使用百度云存储BCS实例
Feb 08 Python
Python自动生产表情包
Mar 17 Python
Windows下Anaconda的安装和简单使用方法
Jan 04 Python
使用Python开发SQLite代理服务器的方法
Dec 07 Python
python将视频转换为全字符视频
Apr 26 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
Aug 19 Python
python 列表推导式使用详解
Aug 29 Python
python pygame实现球球大作战
Nov 25 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
Dec 04 Python
python语言的优势是什么
Jun 17 Python
Python3 类型标注支持操作
Jun 02 Python
浅谈Python中对象是如何被调用的
Apr 06 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日历[测试通过]
2008/03/27 PHP
phpcms手机内容页面添加上一篇和下一篇
2015/06/05 PHP
php判断用户是否关注微信公众号
2016/07/22 PHP
php处理多图上传压缩代码功能
2018/06/13 PHP
PHP标准库 (SPL)――Countable用法示例
2020/06/05 PHP
javascript 跨浏览器开发经验总结(五) js 事件
2010/05/19 Javascript
javascript一个无懈可击的实例化XMLHttpRequest的方法
2010/10/13 Javascript
javascript移出节点removeChild()使用介绍
2014/04/03 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
2014/08/01 Javascript
jquery delay()介绍及使用指南
2014/09/02 Javascript
JavaScript对表格或元素按文本,数字或日期排序的方法
2015/05/26 Javascript
全面解析Bootstrap表单使用方法(表单按钮)
2015/11/24 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
2016/01/22 Javascript
JS传递对象数组为参数给后端,后端获取的实例代码
2016/06/28 Javascript
arcgis for js 修改infowindow样式的方法
2016/11/02 Javascript
jQuery 开发之EasyUI 添加数据的实例
2017/09/26 jQuery
three.js中文文档学习之创建场景
2017/11/20 Javascript
从vue源码解析Vue.set()和this.$set()
2018/08/30 Javascript
微信小程序学习之自定义滚动弹窗
2020/12/20 Javascript
[04:09]2018年度DOTA2社区贡献奖-完美盛典
2018/12/16 DOTA
Python实现对excel文件列表值进行统计的方法
2015/07/25 Python
Python使用dis模块把Python反编译为字节码的用法详解
2016/06/14 Python
Python中的字符串查找操作方法总结
2016/06/27 Python
Python爬虫beautifulsoup4常用的解析方法总结
2019/02/25 Python
PyQt5 QTableView设置某一列不可编辑的方法
2019/06/25 Python
Python实现 PS 图像调整中的亮度调整
2019/06/28 Python
Django框架ORM数据库操作实例详解
2019/11/07 Python
Django Channel实时推送与聊天的示例代码
2020/04/30 Python
XD健身器材:Kevlar球、Crossfit健身球
2019/03/26 全球购物
将"引用"作为函数参数有哪些特点
2013/04/05 面试题
五年级英语教学反思
2014/01/31 职场文书
精彩的广告词
2014/03/19 职场文书
教师信息技术学习心得体会
2016/01/21 职场文书
《童年的发现》教学反思
2016/02/18 职场文书
实用干货:敬酒词大全,帮你应付各种场合
2019/11/21 职场文书
Python面向对象之内置函数相关知识总结
2021/06/24 Python