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 04 Python
Python中每次处理一个字符的5种方法
May 21 Python
Python编程pygal绘图实例之XY线
Dec 09 Python
Python判断文件和字符串编码类型的实例
Dec 21 Python
Python实现判断给定列表是否有重复元素的方法
Apr 11 Python
Python文件循环写入行时防止覆盖的解决方法
Nov 09 Python
pycharm的console输入实现换行的方法
Jan 16 Python
python钉钉机器人运维脚本监控实例
Feb 20 Python
Django对接支付宝实现支付宝充值金币功能示例
Dec 17 Python
Python Tensor FLow简单使用方法实例详解
Jan 14 Python
如何用Python提取10000份log中的产品信息
Jan 14 Python
python基础之while循环语句的使用
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设计模式 Mediator (中介者模式)
2011/06/26 PHP
探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解
2013/06/20 PHP
高性能PHP框架Symfony2经典入门教程
2014/07/08 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
2014/08/23 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
2019/05/27 PHP
javascript jQuery $.post $.ajax用法
2008/07/09 Javascript
基于JQuery实现异步刷新的代码(转载)
2011/03/29 Javascript
jquery随意添加移除html的实现代码
2011/06/21 Javascript
jQuery中使用each处理json数据
2015/04/23 Javascript
整理关于Bootstrap过渡动画的慕课笔记
2017/03/29 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
2018/12/28 Javascript
解决python读取几千万行的大表内存问题
2018/06/26 Python
浅谈PySpark SQL 相关知识介绍
2019/06/14 Python
python实现京东订单推送到测试环境,提供便利操作示例
2019/08/09 Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
2019/08/13 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
2019/12/12 Python
python图片验证码识别最新模块muggle_ocr的示例代码
2020/07/03 Python
Python实现曲线拟合的最小二乘法
2021/02/19 Python
python如何发送带有附件、正文为HTML的邮件
2021/02/27 Python
微软澳洲官方网站:Microsoft Australia
2017/01/10 全球购物
18-35岁旅游团的全球领导者:Contiki
2017/02/08 全球购物
泰国网上购物:Shopee泰国
2018/09/14 全球购物
兰蔻俄罗斯官方网站:Lancome俄罗斯
2019/12/09 全球购物
美国乒乓球设备、配件和服装品牌:Killerspin
2020/06/07 全球购物
素质拓展感言
2014/01/29 职场文书
职工运动会邀请函
2014/02/02 职场文书
个人简历自我评价范文
2014/02/04 职场文书
优秀的导游求职信范文
2014/04/06 职场文书
初中生操行评语大全
2014/04/24 职场文书
婚前协议书范本
2014/10/27 职场文书
医德医风个人工作总结2014
2014/11/14 职场文书
年度考核个人总结
2015/03/06 职场文书
法定代表人免职证明
2015/06/24 职场文书
“5.12”护士节主持词
2015/07/04 职场文书
CentOS7和8下安装Maven3.8.4
2022/04/07 Servers
Java 多态分析
2022/04/26 Java/Android