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实现的DES加密算法和3DES加密算法实例
Jun 03 Python
利用Python读取文件的四种不同方法比对
May 18 Python
python 中random模块的常用方法总结
Jul 08 Python
python中logging库的使用总结
Oct 18 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
Oct 21 Python
PyTorch的SoftMax交叉熵损失和梯度用法
Jan 15 Python
Python运行提示缺少模块问题解决方案
Apr 02 Python
学会python自动收发邮件 代替你问候女友
May 20 Python
Tensorflow tensor 数学运算和逻辑运算方式
Jun 30 Python
Python3爬虫中pyspider的安装步骤
Jul 29 Python
Python 利用argparse模块实现脚本命令行参数解析
Dec 28 Python
Django中celery的使用项目实例
Jul 07 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实现小型站点广告管理
2006/10/09 PHP
PHP rawurlencode与urlencode函数的深入分析
2013/06/08 PHP
php中动态修改ini配置
2014/10/14 PHP
浅谈PHP解析URL函数parse_url和parse_str
2014/11/11 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
PHP字符串和十六进制如何实现互相转换
2020/07/16 PHP
DOM精简教程
2006/10/03 Javascript
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
javascript操作table(insertRow,deleteRow,insertCell,deleteCell方法详解)
2013/12/16 Javascript
使用js判断TextBox控件值改变然后出发事件
2014/03/07 Javascript
jquery+css3打造一款ajax分页插件(自写)
2014/06/18 Javascript
Javascript模拟加速运动与减速运动代码分享
2014/12/11 Javascript
javascript给span标签赋值的方法
2015/11/26 Javascript
javascript类型系统 Array对象学习笔记
2016/01/09 Javascript
AngularJS基础 ng-class-odd 指令示例
2016/08/01 Javascript
vue-router 学习快速入门
2017/03/01 Javascript
JS实现标签页切换效果
2017/05/04 Javascript
MUI顶部选项卡的用法(tab-top-webview-main)详解
2017/10/08 Javascript
webstrom Debug 调试vue项目的方法步骤
2018/07/17 Javascript
vue学习笔记之过滤器的基本使用方法实例分析
2020/02/01 Javascript
Vue2.0 $set()的正确使用详解
2020/07/28 Javascript
Python本地与全局命名空间用法实例
2015/06/16 Python
python好玩的项目—色情图片识别代码分享
2017/11/07 Python
Python 实现淘宝秒杀的示例代码
2018/01/02 Python
python统计中文字符数量的两种方法
2019/01/31 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
2019/06/21 Python
Python实现EXCEL表格的排序功能示例
2019/06/25 Python
python编写微信公众号首图思路详解
2019/12/13 Python
Lacoste美国官网:经典POLO衫品牌
2016/10/12 全球购物
乐天旅游香港网站:日本饭店预订
2017/11/29 全球购物
利物浦足球俱乐部官方网上商店:Liverpool FC Official Store
2018/01/13 全球购物
档案检查欢迎词
2014/01/13 职场文书
个人现实表现材料
2014/02/04 职场文书
乡镇团委工作总结2015
2015/05/26 职场文书
坚持不是死撑,更重要的是心态
2019/08/19 职场文书
SpringCloud Feign请求头删除修改的操作代码
2022/03/20 Java/Android