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的Django框架中显示对象子集的方法
Jul 21 Python
Python常用库推荐
Dec 04 Python
python实现解数独程序代码
Apr 12 Python
Django中间件工作流程及写法实例代码
Feb 06 Python
Python用于学习重要算法的模块pygorithm实例浅析
Aug 16 Python
Django跨域请求CSRF的方法示例
Nov 11 Python
Python 脚本获取ES 存储容量的实例
Dec 27 Python
Python安装Flask环境及简单应用示例
May 03 Python
python+django+rest框架配置创建方法
Aug 31 Python
学python爬虫能做什么
Jul 29 Python
python 求两个向量的顺时针夹角操作
Mar 04 Python
Django cookie和session的应用场景及如何使用
Apr 29 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
初探PHP5
2006/10/09 PHP
PHP5 面向对象程序设计
2008/02/13 PHP
用PHP提取中英文词语以及数字的首字母的方法介绍
2013/04/23 PHP
php中的curl_multi系列函数使用例子
2014/07/29 PHP
memcache一致性hash的php实现方法
2015/03/05 PHP
html读出文本文件内容
2007/01/22 Javascript
JS的replace方法介绍
2012/10/20 Javascript
Javascript计算两个marker之间的距离(Google Map V3)
2013/04/26 Javascript
JavaScript获取图片真实大小代码实例
2014/09/24 Javascript
jquery实现Slide Out Navigation滑出式菜单效果代码
2015/09/07 Javascript
浅谈JS的基础类型与引用类型
2016/09/13 Javascript
JavaScript省市区三级联动菜单效果
2016/09/21 Javascript
Javascript动画效果(4)
2016/10/11 Javascript
javascript淘宝主图放大镜功能
2016/10/20 Javascript
Node.js中路径处理模块path详解
2016/11/14 Javascript
jquery心形点赞关注效果的简单实现
2016/11/14 Javascript
Node.js连接postgreSQL并进行数据操作
2016/12/18 Javascript
js限制input只能输入有效的数字(第一个不能是小数点)
2018/09/28 Javascript
微信小程序 数据缓存实现方法详解
2019/08/26 Javascript
python进阶教程之模块(module)介绍
2014/08/30 Python
跟老齐学Python之集合(set)
2014/09/24 Python
Python类的多重继承问题深入分析
2014/11/09 Python
python实现带验证码网站的自动登陆实现代码
2015/01/12 Python
Python中使用Boolean操作符做真值测试实例
2015/01/30 Python
Python开发之快速搭建自动回复微信公众号功能
2016/04/22 Python
python读取文件名称生成list的方法
2018/04/27 Python
Python 添加文件注释和函数注释操作
2020/08/09 Python
python 生成正态分布数据,并绘图和解析
2020/12/21 Python
HTML5里的placeholder属性使用实例和美化显示效果的方法
2014/04/23 HTML / CSS
求职简历推荐信范文
2013/12/02 职场文书
我的动漫时代的创业计划书范文
2014/01/27 职场文书
座谈会主持词
2014/03/20 职场文书
党员承诺书范文
2014/05/19 职场文书
学校党的群众路线教育实践活动对照检查材料
2014/09/24 职场文书
国家税务局领导班子对照检查材料思想汇报
2014/10/04 职场文书
2014年德育工作总结
2014/11/20 职场文书