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使用forms来实现评论功能
Aug 17 Python
python实现感知器算法详解
Dec 19 Python
python生成圆形图片的方法
Mar 25 Python
python将txt文件读入为np.array的方法
Oct 30 Python
Python 通过打码平台实现验证码的实现
May 13 Python
python解压TAR文件至指定文件夹的实例
Jun 10 Python
Python lxml模块的基本使用方法分析
Dec 21 Python
详解Python中的分支和循环结构
Feb 11 Python
Python 3.8 新功能来一波(大部分人都不知道)
Mar 11 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
Mar 01 Python
Python OpenCV超详细讲解调整大小与图像操作的实现
Apr 02 Python
Anaconda安装pytorch和paddle的方法步骤
Apr 03 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
15个小时----从修改程序到自己些程序
2006/10/09 PHP
PHP嵌套输出缓冲代码实例
2015/05/12 PHP
PHP超全局数组(Superglobals)介绍
2015/07/01 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
2016/06/12 PHP
php上传excel表格并获取数据
2017/04/27 PHP
PHP基于自定义类随机生成姓名的方法示例
2017/08/05 PHP
使用TextRange获取输入框中光标的位
2006/10/14 Javascript
用javascript将数据库中的TEXT类型数据动态赋值到TEXTAREA中
2007/04/20 Javascript
JavaScript 数组的 uniq 方法
2008/01/23 Javascript
jquery插件 autoComboBox 下拉框
2010/12/22 Javascript
js实现瀑布流的一种简单方法实例分享
2013/11/04 Javascript
jQuery(js)获取文字宽度(显示长度)示例代码
2013/12/31 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
js字符串完全替换函数分享
2014/12/03 Javascript
JavaScript基础篇(3)之Object、Function等引用类型
2015/11/30 Javascript
NodeJS远程代码执行
2016/08/28 NodeJs
JavaScript实现弹出广告功能
2017/03/30 Javascript
关于Vue实现组件信息的缓存问题
2017/08/23 Javascript
慕课网题目之js实现抽奖系统功能
2017/09/19 Javascript
vuejs实现ready函数加载完之后执行某个函数的方法
2018/08/31 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
Vue关于组件化开发知识点详解
2020/05/13 Javascript
centos6.7安装python2.7.11的具体方法
2017/01/16 Python
在Mac下使用python实现简单的目录树展示方法
2018/11/01 Python
在Python中append以及extend返回None的例子
2019/07/20 Python
实例详解Python装饰器与闭包
2019/07/29 Python
python用TensorFlow做图像识别的实现
2020/04/21 Python
CSS3 box-shadow属性实例详解
2020/06/19 HTML / CSS
html5中为audio标签增加停止按钮动作实现方法
2013/01/04 HTML / CSS
详解android与HTML混合开发总结
2018/06/06 HTML / CSS
18岁生日感言
2014/01/12 职场文书
连锁酒店店长职责范本
2014/02/13 职场文书
物流专员岗位职责
2014/02/17 职场文书
八一建军节演讲稿
2014/09/10 职场文书
靠谱的活动总结
2019/04/16 职场文书
Python进行区间取值案例讲解
2021/08/02 Python