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 相关文章推荐
Windows和Linux下使用Python访问SqlServer的方法介绍
Mar 10 Python
解析Python中的二进制位运算符
May 13 Python
Python base64编码解码实例
Jun 21 Python
python实现FTP服务器服务的方法
Apr 11 Python
Python探索之自定义实现线程池
Oct 27 Python
Python 判断是否为质数或素数的实例
Oct 30 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
Sep 17 Python
便捷提取python导入包的属性方法
Oct 15 Python
python3实现表白神器
Apr 09 Python
python enumerate内置函数用法总结
Jan 07 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
Feb 20 Python
详解Go语言运用广度优先搜索走迷宫
Jun 23 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种PHP Encoder的比较
2007/04/17 PHP
Windows下安装Memcached的步骤说明
2010/04/25 PHP
php下foreach提示Warning:Invalid argument supplied for foreach()的解决方法
2014/11/11 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
2014/11/25 PHP
PHP格式化MYSQL返回float类型的方法
2016/03/30 PHP
php微信公众号开发之翻页查询
2018/10/20 PHP
对YUI扩展的Gird组件 Part-1
2007/03/10 Javascript
Jquery同辈元素选中/未选中效果的实例代码
2013/08/01 Javascript
JS操作Cookie写入和读取实例代码
2013/10/20 Javascript
判断某个字符在一个字符串中是否存在的js代码
2014/02/28 Javascript
一个支付页面DEMO附截图
2014/07/22 Javascript
json传值以及ajax接收详解
2016/05/24 Javascript
AngularJS入门教程之MVC架构实例分析
2016/11/01 Javascript
Node.js和Express简单入门介绍
2017/03/24 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
2017/06/03 Javascript
BackBone及其实例探究_动力节点Java学院整理
2017/07/14 Javascript
vue axios用法教程详解
2017/07/23 Javascript
详解js删除数组中的指定元素
2018/10/31 Javascript
详解Vue调用手机相机和相册以及上传
2019/05/05 Javascript
小程序中this.setData的使用和注意事项
2019/08/28 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
2019/11/07 Javascript
React学习之JSX与react事件实例分析
2020/01/06 Javascript
Javascript新手入门之字符串拼接与变量的应用
2020/12/03 Javascript
Python切片知识解析
2016/03/06 Python
Python编程实现二分法和牛顿迭代法求平方根代码
2017/12/04 Python
Python中时间datetime的处理与转换用法总结
2019/02/18 Python
Python爬虫设置ip代理过程解析
2020/07/20 Python
单位办理社保介绍信
2014/01/10 职场文书
省优秀教师事迹材料
2014/01/30 职场文书
研修第一天随笔感言
2014/02/15 职场文书
请假条的格式
2014/04/11 职场文书
2015年度护士个人工作总结
2015/04/09 职场文书
单位接收证明格式
2015/06/18 职场文书
oracle表分区的概念及操作
2021/04/24 Oracle
go语言中GOPATH GOROOT的作用和设置方式
2021/05/05 Golang
使用python绘制分组对比柱状图
2022/04/21 Python