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备份文件的脚本
Aug 11 Python
Python3指定路径寻找符合匹配模式文件
May 22 Python
python3使用requests模块爬取页面内容的实战演练
Sep 25 Python
对numpy中shape的深入理解
Jun 15 Python
对python创建及引用动态变量名的示例讲解
Nov 10 Python
python单线程文件传输的实例(C/S)
Feb 13 Python
Python中的random.uniform()函数教程与实例解析
Mar 02 Python
python爬虫-模拟微博登录功能
Sep 12 Python
python自动分箱,计算woe,iv的实例代码
Nov 22 Python
解决python中的幂函数、指数函数问题
Nov 25 Python
tensorflow 实现自定义layer并添加到计算图中
Feb 04 Python
python​格式化字符串
Apr 20 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文件系统管理(实例讲解)
2017/09/19 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
2018/03/15 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
Mootools 1.2教程(21)——类(二)
2009/09/15 Javascript
js定时器怎么写?就是在特定时间执行某段程序
2013/10/11 Javascript
javascript间隔刷新的简单实例
2013/11/14 Javascript
jquery动态加载select下拉框示例代码
2013/12/10 Javascript
JavaScript bold方法入门实例(把指定文字显示为粗体)
2014/10/17 Javascript
jQuery实现的仿select功能代码
2015/08/19 Javascript
AngularJS 中文API参考手册
2016/07/28 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
2016/08/01 Javascript
浅谈Angular2 ng-content 指令在组件中嵌入内容
2017/08/18 Javascript
详解vue2.0 使用动态组件实现 Tab 标签页切换效果(vue-cli)
2017/08/30 Javascript
javascript基础进阶_深入剖析执行环境及作用域链
2017/09/05 Javascript
详解Node全局变量global模块
2017/09/28 Javascript
vue实现一拉到底的滑动验证
2019/07/25 Javascript
Node4-5静态资源服务器实战以及优化压缩文件实例内容
2019/08/29 Javascript
云服务器部署Node.js项目的方法步骤(小白系列)
2020/03/23 Javascript
SpringBoot在yml配置文件中配置druid的操作
2020/11/16 Javascript
举例简单讲解Python中的数据存储模块shelve的用法
2016/03/03 Python
详解Python中最难理解的点-装饰器
2017/04/03 Python
全面了解django的缓存机制及使用方法
2019/07/22 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
2020/04/20 Python
JupyterNotebook 输出窗口的显示效果调整实现
2020/09/22 Python
俄罗斯在线大型超市:ТутПросто
2021/01/08 全球购物
VC++笔试题
2014/10/13 面试题
迟到检讨书1000字
2014/01/15 职场文书
银行服务明星推荐材料
2014/05/29 职场文书
最美孝心少年事迹材料
2014/08/15 职场文书
2014机关干部学习“焦裕禄精神”思想汇报
2014/09/19 职场文书
领导班子个人对照检查剖析材料
2014/09/29 职场文书
2014年党的群众路线学习心得体会
2014/11/05 职场文书
2014年扶贫工作总结
2014/11/18 职场文书
关于拾金不昧的感谢信
2015/01/21 职场文书
出国留学自荐信模板
2015/03/06 职场文书
MySQL 常见的数据表设计误区汇总
2021/06/07 MySQL