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实现获取序列中最小的几个元素
Sep 25 Python
Python的Flask框架中实现分页功能的教程
Apr 20 Python
Python数据类型详解(四)字典:dict
May 12 Python
Python之reload流程实例代码解析
Jan 29 Python
使用pandas中的DataFrame数据绘制柱状图的方法
Apr 10 Python
使用pandas将numpy中的数组数据保存到csv文件的方法
Jun 14 Python
Python实现分段线性插值
Dec 17 Python
对pyqt5多线程正确的开启姿势详解
Jun 14 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
Jun 17 Python
简单了解python 生成器 列表推导式 生成器表达式
Aug 22 Python
Python 类方法和实例方法(@classmethod),静态方法(@staticmethod)原理与用法分析
Sep 20 Python
PyCharm GUI界面开发和exe文件生成的实现
Mar 04 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中截取字符串支持utf-8
2007/01/18 PHP
解析centos中Apache、php、mysql 默认安装路径
2013/06/25 PHP
php+mysqli使用面向对象方式查询数据库实例
2015/01/29 PHP
XML的代替者----JSON
2007/07/21 Javascript
分析 JavaScript 中令人困惑的变量赋值
2007/08/13 Javascript
IE与firefox下Dhtml的一些区别小结
2009/12/02 Javascript
JavaScript类和继承 this属性使用说明
2010/09/03 Javascript
jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片)
2012/05/23 Javascript
js数组去重的方法汇总
2015/07/29 Javascript
提升jQuery的性能需要做好七件事
2016/01/11 Javascript
javascript 动态脚本添加的简单方法
2016/10/11 Javascript
谈谈jQuery之Deferred源码剖析
2016/12/19 Javascript
最基础的vue.js双向绑定操作
2017/08/23 Javascript
js中this对象用法分析
2018/01/05 Javascript
vue2.0+ 从插件开发到npm发布的示例代码
2018/04/28 Javascript
JS实现查找数组中对象的属性值是否存在示例
2019/05/24 Javascript
基于vue的tab-list类目切换商品列表组件的示例代码
2020/02/14 Javascript
Vue基于iview table展示图片实现点击放大
2020/08/05 Javascript
Python进程通信之匿名管道实例讲解
2015/04/11 Python
python 根据正则表达式提取指定的内容实例详解
2016/12/04 Python
python获取多线程及子线程的返回值
2017/11/15 Python
python @property的用法及含义全面解析
2018/02/01 Python
python 实现一个图形界面的汇率计算器
2020/11/09 Python
Maje德国官网:法国女性成衣品牌
2017/02/10 全球购物
美国羊皮公司:Overland
2018/01/15 全球购物
Bonami斯洛伐克:购买家具和家居饰品
2019/07/02 全球购物
学校安全教育制度
2014/01/31 职场文书
电子商务专业毕业生求职信
2014/06/12 职场文书
2014标准社保办理委托书
2014/10/06 职场文书
环卫工人慰问信
2015/02/15 职场文书
幼儿园教师工作总结2015
2015/04/02 职场文书
农民工工资保障承诺书
2015/05/04 职场文书
侵犯商业秘密的律师函
2015/05/27 职场文书
人民币使用说明书
2019/04/17 职场文书
Python数据可视化之基于pyecharts实现的地理图表的绘制
2021/06/10 Python
Win11 PC上的Outlook搜索错误怎么办?
2022/07/15 数码科技