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函数参数*args**kwargs用法实例
Dec 04 Python
Python中的默认参数实例分析
Jan 29 Python
完美解决安装完tensorflow后pip无法使用的问题
Jun 11 Python
python将类似json的数据存储到MySQL中的实例
Jul 12 Python
python绘图模块matplotlib示例详解
Jul 26 Python
Python PyQt5模块实现窗口GUI界面代码实例
May 12 Python
用Python 爬取猫眼电影数据分析《无名之辈》
Jul 24 Python
Django自定义YamlField实现过程解析
Nov 11 Python
五种Python转义表示法
Nov 27 Python
详解Python中的Lock和Rlock
Jan 26 Python
用Python远程登陆服务器的步骤
Apr 16 Python
七个Python必备的GUI库
Apr 27 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后台多用户权限组思路与实现程序代码分享
2012/02/13 PHP
CodeIgniter扩展核心类实例详解
2016/01/20 PHP
Zend Framework教程之Application用法实例详解
2016/03/14 PHP
laravel中命名路由的使用方法
2017/02/24 PHP
JavaScript Sort 表格排序
2009/10/31 Javascript
Javascript面向对象编程
2012/03/18 Javascript
JS调试必备的5个debug技巧
2014/03/07 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
2016/05/20 Javascript
IScroll5 中文API参数说明和调用方法
2016/05/21 Javascript
详解Angular-Cli中引用第三方库
2017/05/21 Javascript
微信JSAPI Ticket接口签名详解
2020/06/28 Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
2019/07/16 Javascript
layui递归实现动态左侧菜单
2019/07/26 Javascript
python生成日历实例解析
2014/08/21 Python
Django开发中复选框用法示例
2018/03/20 Python
关于django 数据库迁移(migrate)应该知道的一些事
2018/05/27 Python
Python Matplotlib 基于networkx画关系网络图
2019/07/10 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
2019/12/19 Python
浅谈python之自动化运维(Paramiko)
2020/01/31 Python
Python实现发票自动校核微信机器人的方法
2020/05/22 Python
python程序需要编译吗
2020/06/19 Python
基于HTML5的WebSocket的实例代码
2018/08/15 HTML / CSS
将SVG图引入到HTML页面的实现
2019/09/20 HTML / CSS
印度在线杂货店:bigbasket
2018/08/23 全球购物
链表面试题-一个链表的结点结构
2015/05/04 面试题
房屋买卖协议书
2014/04/10 职场文书
捐款倡议书格式范文
2014/05/14 职场文书
学生无故旷课检讨书
2014/09/20 职场文书
五年级上册复习计划
2015/01/19 职场文书
房租涨价通知
2015/04/23 职场文书
小英雄雨来观后感
2015/06/09 职场文书
胡桃夹子观后感
2015/06/11 职场文书
2016年乡镇综治宣传月活动总结
2016/03/16 职场文书
解决Navicat for Mysql连接报错1251的问题(连接失败)
2021/05/27 MySQL
nginx内存池源码解析
2021/11/20 Servers
django中websocket的具体使用
2022/01/22 Python