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的Flask框架中的signals信号机制
Jun 13 Python
Python实现统计代码行的方法分析
Jul 12 Python
python正则表达式re之compile函数解析
Oct 25 Python
Python列表推导式与生成器表达式用法示例
Feb 08 Python
详解python多线程、锁、event事件机制的简单使用
Apr 27 Python
python中不能连接超时的问题及解决方法
Jun 10 Python
python读取目录下所有的jpg文件,并显示第一张图片的示例
Jun 13 Python
详解Python中的各种转义符\n\r\t
Jul 10 Python
Python序列化pickle模块使用详解
Mar 05 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
Jul 01 Python
python中子类与父类的关系基础知识点
Feb 02 Python
pytorch 两个GPU同时训练的解决方案
Jun 01 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中session_unset与session_destroy的区别分析
2011/06/16 PHP
discuz目录文件资料汇总
2014/12/30 PHP
php生成数字字母的验证码图片
2015/07/14 PHP
jquery插件jbox使用iframe关闭问题
2009/02/09 Javascript
优化javascript的执行速度
2010/01/23 Javascript
用jquery生成二级菜单的实例代码
2013/06/24 Javascript
php跨域调用json的例子
2013/11/13 Javascript
jQuery使用hide方法隐藏指定元素class样式用法实例
2015/03/30 Javascript
JavaScript自动点击链接 防止绕过浏览器访问的方法
2017/01/19 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
解决vue打包css文件中背景图片的路径问题
2018/09/03 Javascript
JS监听事件的叠加和移除功能
2018/11/19 Javascript
vue 弹出遮罩层样式实例
2020/07/22 Javascript
vue项目中openlayers绘制行政区划
2020/12/24 Vue.js
跟老齐学Python之做一个小游戏
2014/09/28 Python
Python实现在线程里运行scrapy的方法
2015/04/07 Python
Python 内置函数complex详解
2016/10/23 Python
Python编程使用NLTK进行自然语言处理详解
2017/11/16 Python
python如何重载模块实例解析
2018/01/25 Python
Python中GeoJson和bokeh-1的使用讲解
2019/01/03 Python
python 读取更新中的log 或其它文本方式
2019/12/24 Python
详解有关PyCharm安装库失败的问题的解决方法
2020/02/02 Python
使用Python 自动生成 Word 文档的教程
2020/02/13 Python
virtualenv介绍及简明教程
2020/06/23 Python
html5的websockets全双工通信详解学习示例
2014/02/26 HTML / CSS
canvas学习总结三之绘制路径-线段
2019/01/31 HTML / CSS
美国在线咖啡、茶和餐厅供应商:LollicupStore
2018/05/04 全球购物
应届生服务员求职信
2013/10/31 职场文书
《小猫刮胡子》教学反思
2014/02/21 职场文书
好学生评语大全
2014/05/05 职场文书
大学新生入学教育方案
2014/05/16 职场文书
鸟的天堂导游词
2015/01/31 职场文书
2015年度绩效考核工作总结
2015/05/27 职场文书
2019年让高校“心动”的自荐信
2019/03/25 职场文书
如何Tomcat中使用ipv6地址
2022/05/06 Servers
go goth封装第三方认证库示例详解
2022/08/14 Golang