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中global用法实例分析
Apr 30 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
Apr 24 Python
Python中查看文件名和文件路径
Mar 31 Python
windows10下python3.5 pip3安装图文教程
Apr 02 Python
查看Django和flask版本的方法
May 14 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
Oct 21 Python
python自定义时钟类、定时任务类
Feb 22 Python
python调用支付宝支付接口流程
Aug 15 Python
Python实现微信机器人的方法
Sep 06 Python
浅谈对pytroch中torch.autograd.backward的思考
Dec 27 Python
Pytorch根据layers的name冻结训练方式
Jan 06 Python
pandas创建DataFrame的7种方法小结
Jun 14 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无限分类的深入理解
2013/06/02 PHP
php之readdir函数用法实例
2014/11/13 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
2017/03/09 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
php的instanceof和判断闭包Closure操作示例
2020/01/26 PHP
PHP 范围解析操作符(::)用法分析【访问静态成员和类常量】
2020/04/14 PHP
Gird事件机制初级读本
2007/03/10 Javascript
javascript 学习之旅 (1)
2009/02/05 Javascript
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
2013/01/15 Javascript
jQuery常用操作方法及常用函数总结
2014/06/19 Javascript
javascript中sort()的用法实例分析
2015/01/30 Javascript
javascript封装 Cookie 应用接口
2015/08/07 Javascript
JS控制文本域只读或可写属性的方法
2016/06/24 Javascript
js数组方法reduce经典用法代码分享
2018/01/07 Javascript
JS如何实现网站中PC端和手机端自动识别并跳转对应的代码
2020/01/08 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
js正则表达式简单校验方法
2021/01/03 Javascript
python实现异步回调机制代码分享
2014/01/10 Python
Python3实现的画图及加载图片动画效果示例
2018/01/19 Python
python实现二叉查找树实例代码
2018/02/08 Python
Python Dataframe 指定多列去重、求差集的方法
2018/07/10 Python
python写程序统计词频的方法
2019/07/29 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
2020/03/10 Python
python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)
2021/02/19 Python
浅析CSS3 用text-overflow解决文字排版问题
2020/10/28 HTML / CSS
捷克母婴用品购物网站:Feedo.cz
2020/12/28 全球购物
自立自强的名人事例
2014/02/10 职场文书
中专毕业生个人职业生涯规划
2014/02/19 职场文书
企业负责人任命书
2014/06/05 职场文书
员工工作及收入证明
2014/10/28 职场文书
2014业务员年终工作总结
2014/12/09 职场文书
调研报告的主要写法
2019/04/18 职场文书
辞职信怎么写?
2019/05/21 职场文书
Unity连接MySQL并读取表格数据的实现代码
2021/06/20 MySQL
Python实现Matplotlib,Seaborn动态数据图
2022/05/06 Python