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 相关文章推荐
PyQt5 pyqt多线程操作入门
May 05 Python
Python实现重建二叉树的三种方法详解
Jun 23 Python
python 寻找list中最大元素对应的索引方法
Jun 28 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
Oct 21 Python
python实现多进程代码示例
Oct 31 Python
教你一步步利用python实现贪吃蛇游戏
Jun 27 Python
python自定义时钟类、定时任务类
Feb 22 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
Oct 12 Python
Django多进程滚动日志问题解决方案
Dec 17 Python
python 引用传递和值传递详解(实参,形参)
Jun 05 Python
利用python进行文件操作
Dec 04 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
Jan 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 gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
2010/05/15 PHP
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
2010/11/01 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
2015/03/03 PHP
PHP多文件上传类实例
2015/03/07 PHP
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
利用PHP生成静态html页面的原理
2016/09/30 PHP
php利用ZipArchive类操作文件的实例
2020/01/21 PHP
JQuery 前台切换网站的样式实现
2009/06/22 Javascript
JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js
2012/08/14 Javascript
jquery弹出层类代码分享
2013/12/27 Javascript
node.js操作mysql(增删改查)
2015/07/24 Javascript
JavaScript函数内部属性和函数方法实例详解
2016/03/17 Javascript
js利用appendChild对标签进行排序的实现方法
2016/10/16 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
js实现加载更多功能实例
2016/10/27 Javascript
原生js实现验证码功能
2017/03/16 Javascript
详解vue+css3做交互特效的方法
2017/11/20 Javascript
深入浅出理解JavaScript高级定时器原理与用法
2018/08/02 Javascript
JavaScript箭头函数中的this详解
2019/06/19 Javascript
Openlayers测量距离与面积的实现方法
2020/09/25 Javascript
pydev使用wxpython找不到路径的解决方法
2013/02/10 Python
python中使用pyhook实现键盘监控的例子
2014/07/18 Python
Python原始字符串(raw strings)用法实例
2014/10/13 Python
在Python中操作字典之update()方法的使用
2015/05/22 Python
python获取指定路径下所有指定后缀文件的方法
2015/05/26 Python
Python中函数的参数定义和可变参数用法实例分析
2015/06/04 Python
python requests使用socks5的例子
2019/07/25 Python
python实现多进程按序号批量修改文件名的方法示例
2019/12/30 Python
Python中sys模块功能与用法实例详解
2020/02/26 Python
自定义Django默认的sitemap站点地图样式
2020/03/04 Python
css3 盒模型以及box-sizing属性全面了解
2016/09/20 HTML / CSS
牵手50香港:专为黄金岁月的单身人士而设的交友网站
2020/08/14 全球购物
管事部库房保管员岗位职责
2014/02/21 职场文书
人事任命书格式
2014/06/05 职场文书
公司离职证明样本
2014/09/13 职场文书
MySQL Router的安装部署
2021/04/24 MySQL