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以并发方式编写高性能端口扫描器的方法
Jun 14 Python
python操作MySQL 模拟简单银行转账操作
Sep 27 Python
Python编程pygame模块实现移动的小车示例代码
Jan 03 Python
python生成lmdb格式的文件实例
Nov 08 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
Dec 10 Python
python脚本开机自启的实现方法
Jun 28 Python
django 多对多表的创建和插入代码实现
Sep 09 Python
pygame实现俄罗斯方块游戏(基础篇2)
Oct 29 Python
Python类和实例的属性机制原理详解
Mar 21 Python
windows10环境下用anaconda和VScode配置的图文教程
Mar 30 Python
Python利用socket模块开发简单的端口扫描工具的实现
Jan 27 Python
Pytorch如何切换 cpu和gpu的使用详解
Mar 01 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传参之传值与传址的区别
2015/04/24 PHP
深入理解PHP类的自动载入机制
2016/09/16 PHP
浅谈php处理后端&amp;接口访问超时的解决方法
2016/10/29 PHP
Zend Framework基于Command命令行建立ZF项目的方法
2017/02/18 PHP
让JavaScript 轻松支持函数重载 (Part 1 - 设计)
2009/08/04 Javascript
javascript instanceof 内部机制探析
2010/10/15 Javascript
jquery连缀语法如何实现
2012/11/29 Javascript
基于jquery实现点击左右按钮图片横向滚动
2013/04/11 Javascript
JS中setTimeout()的用法详解
2013/04/14 Javascript
JavaScript获取页面中第一个锚定文本的方法
2015/04/03 Javascript
JavaScript encodeURI 和encodeURIComponent
2015/12/04 Javascript
js纯数字逐一停止显示效果的实现代码
2016/03/16 Javascript
通过Ajax使用FormData对象无刷新上传文件方法
2016/12/08 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
2017/04/07 Javascript
bootstrap paginator分页插件的两种使用方式实例详解
2017/11/14 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
2018/01/26 Javascript
JS加密插件CryptoJS实现AES加密操作示例
2018/08/16 Javascript
解决Vue中引入swiper,在数据渲染的时候,发生不滑动的问题
2018/09/27 Javascript
vue router动态路由设置参数可选问题
2019/08/21 Javascript
vuex state中的数组变化监听实例
2019/11/06 Javascript
JavaScript装饰者模式原理与用法实例详解
2020/03/09 Javascript
vue根据条件不同显示不同按钮的操作
2020/08/04 Javascript
pycharm 使用心得(八)如何调用另一文件中的函数
2014/06/06 Python
Python下线程之间的共享和释放示例
2015/05/04 Python
Python lxml模块安装教程
2015/06/02 Python
简单解决Python文件中文编码问题
2015/11/22 Python
pytorch点乘与叉乘示例讲解
2019/12/27 Python
TensorFlow内存管理bfc算法实例
2020/02/03 Python
HTML+CSS3模拟心的跳动实例代码
2017/09/05 HTML / CSS
手机业务员岗位职责
2013/12/13 职场文书
井冈山红色之旅感想
2014/10/07 职场文书
先进典型发言材料
2014/12/30 职场文书
2015年学校工作总结范文
2015/04/20 职场文书
2016拓展训练心得体会范文
2016/01/12 职场文书
《你在为谁工作》心得体会(共8篇)
2016/01/20 职场文书
《我在为谁工作》:工作的质量往往决定生活的质量
2019/12/27 职场文书