文档章节

Python3 super与mro表

夏洛特_
 夏洛特_
发布于 2016/11/01 09:20
字数 526
阅读 25
收藏 0

1.MRO表

    返回类型方法顺序的解析表

C3算法计算:

    class B(O)  --> mro(B)  =  [B, O]

    class B(A1, A2, ...)  -->  mro(B)  = [B] + merge(mro(A1), mro(A2), ... , [A1, A2, ...])

    顺序遍历列表

    首元素满足以下条件,否则遍历下一个序列

        在其他序列也是首元素

        在其他序列里不存在

    从所有序列中移除此元素,合并到MRO序列中

    重复执行,直到所有序列为空或无法执行下去

通过树理解:

如果有以下继承关系:

    object
     /   \
    /      A
   |     /   \
  B-1  C-2   D-2
    \   /    /
     E-1    /
        \  /
          F

F的MRO表的计算过程就是:

L(O) = O
L(B) = B O
L(A) = A O
L(C) = C A O
L(D) = D A O
L(E) = E + merge(L(B),L(C)) # merger顺序是继承顺序
     = E + merge(BO,CAO) # B的父类是O,C的父类A的父类O,B和C同层继承,由于E继承B和C时,B在A前
     = E + B + merge(O,CAO)
     = E + B + C + merge(O,AO)
     = E + B + C + A + merge(O,O)
     = E B C A O
L(F) = F + merge(L(E),L(D))
     = F + merge(EBCAO,DAO)  # EBC在DAO中不存在
     = F + EBC + merge(AO,DAO) # A在DAO中存在,D在AO中不存在
     = F + EBC + D + merge(AO,AO) # 同时移除AO
     = F EBC D AO

MRO:

F -> E -> B -> C -> D -> A -> object

MRO计算原则有:

    1.基类永远在派生类后面

    2.类继承的顺序影响MRO的顺序

继承时要满足MRO表,否则抛出无法写入MRO表异常

2.super

    在调用父类方法的过程中,因为继承,子类要先初始化父类的方法,就会导致调用父类的方法会多调用父类的父类的方法

    使用super方法调用,可以避免

super() -> same as super(__class__, <first argument>)
super(type, obj) -> bound super object; requires isinstance(obj, type)
super(type) -> unbound super object
super(type, type2) -> bound super object; requires issubclass(type2, type)
Typical use to call a cooperative superclass method

  super通过返回指代type下一个父类的super对象,进行调用父类方法

  super方法类似于:

def super(cls, inst):
    mro = inst.__class__.mro()
    return mro[mro.index(cls) + 1]

  通过MRO表往下指代

本文转载自:http://gohom.win/2016/02/23/py-super/

共有 人打赏支持
夏洛特_
粉丝 2
博文 80
码字总数 72279
作品 0
宁德
程序员
python2和python3的继承方式的不同,广度优先和深度有限

脚踏黄土,头顶清风,不道苦楚,莫问前程!!! --- 参考文章三篇 简书第一篇 ,简书第二篇,博客园的文章,这篇博客园文章讲的很好 通过继承创建的新类称为“子类”或“派生类”,被继承的类...

鹏灬
09/12
0
0
Python基础-面向对象组合、继承、子类调父类

组合 多个数据属性通过一个类实例化的对象做关联 继承 通过集成可以派生(衍生)出新的方法 单继承 多继承 接口继承 父类规定子类必须要使用的类方法,方便程序归一化设计 接口继承示例 继承顺序...

ZHAO_JH
04/13
0
0
python基础---面向对象编程

面向对象 面向过程与面向对象的对比: 面向过程:核心是过程二字,过程指的是问题的解决步骤,即先干什么再干什么,基于面向过程去设计程序就好比在设计一条流水线,是一种机械式的思维方式 ...

迟到的栋子
07/01
0
0
python MRO:C3算法

在 python 2.2 之后,python 实现了一个新的MRO算法:C3算法,用于方法解析顺序 。 一、什么是方法解析顺序 方法解析顺序 :多重继承时,用于在子类中调用父类方法时确定调用哪个父类的...

Jbryan
2013/06/10
0
1
Python面向对象编程之我见

面向对象基本概念 面向对象是一种编程范式。范式是指一组方法论。编程范式是一组如何组织代码的方法论。编程范式指的是软件工程中的一种方法学。 一些主流的编程范式: OOP - 面向对象编程 ...

bigstone2012
06/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux学习-0919

linux和windows互传文件 用户配置文件和密码配置文件 用户组管理 用户管理 一、linux和windows互传文件 linux和windows可以互相传输文件,但是需要使用xshell 并且安装lrzsz包: yum insta...

wxy丶
26分钟前
1
0
收集几个开源的微信小程序开发框架

1、 mpvue mpvue 是美团点评开源的一个使用 Vue.js 开发小程序的前端框架。框架基于 Vue.js 核心,mpvue 修改了 Vue.js 的 runtime 和 compiler 实现,使其可以运行在小程序环境中,从而为小...

哥本哈根的小哥
33分钟前
1
0
Golang CSP并发模型

今天介绍一下 go语言的并发机制以及它所使用的CSP并发模型 CSP并发模型 CSP模型是上个世纪七十年代提出的,用于描述两个独立的并发实体通过共享的通讯 channel(管道)进行通信的并发模型。 CS...

xtof
33分钟前
1
0
用chrome在电脑上模拟微信内置浏览器

先了解安卓微信和Ios微信的UA(User agent:用户代理) 安卓微信UA: mozilla/5.0 (linux; u; android 4.1.2; zh-cn; mi-one plus build/jzo54k) applewebkit/534.30 (khtml, like gecko) ve......

可达鸭眉头一皱
40分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部