文档章节

Python3 super与mro表

夏洛特_
 夏洛特_
发布于 2016/11/01 09:20
字数 526
阅读 22
收藏 0
点赞 0
评论 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
博文 79
码字总数 70749
作品 0
宁德
程序员
Python基础-面向对象组合、继承、子类调父类

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

ZHAO_JH ⋅ 04/13 ⋅ 0

Python面向对象编程之我见

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

bigstone2012 ⋅ 05/31 ⋅ 0

剖析python子类调用父类方法

super()多重继承会"自动去重" 在上面代码子类中,class son(Father) Father指的明显是父类,那在调用父类方法的时候,可不可以直接Father('tom') Father('tom')呢? 在大多数情况下是没问题的。...

Kurset ⋅ 2017/07/30 ⋅ 0

Python的super解释

在子类中初始化父类, 传统的方式是在子类中直接调用父类的函数: 在继承体系很简单的情况下, 这种方式可以正常运行, 但是在大多数情况下这种方法都是不可行的. 如果一个类继承自多个类, 那么直...

shawnplaying ⋅ 2016/08/10 ⋅ 0

Python: 你不知道的 super

super() 的入门使用 在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可通过使用 来实现,比如:...

funhacks ⋅ 2017/11/29 ⋅ 0

你想要的Python面试都在这里了【315+道题】

写在前面 近日恰逢学生临近毕业,课程后期大家“期待+苦逼”的时刻莫过于每天早上内容回顾和面试题问答部分【临近毕业每天课前用40-60分钟对之前内容回顾、提问和补充,专挑班里不爱说话就的...

p柯西 ⋅ 06/12 ⋅ 0

Python基础面试题80问 Python自动化开发

为什么学习Python? 2. 通过什么途径学习的Python? 3. Python和Java、PHP、C、C#、C++等其他语言的对比? 4. 简述解释型和编译型编程语言? 5. Python解释器种类以及特点? 6. 位和字节的关...

zhouzhou2018 ⋅ 05/24 ⋅ 0

python基础---面向对象编程

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

迟到的栋子 ⋅ 2017/08/31 ⋅ 0

Python学习笔记二十二(多继承 / 属性和方法 / 常量 / with和上下文管理器 )

多继承 狮虎兽, 不知道你有没有听说过? 狮虎兽,是雄狮(Panthera leo)与雌虎(Panthera tigris)杂交后的产物,是属于猫科豹属的一员. 用程序模拟一下狮虎兽. 当子类有多个父类 ( Lion 和 ...

DragonFangQy ⋅ 05/23 ⋅ 0

django 加Oracle 出问题了ORA-02000 无法建表?

django 2.0 python 3.6 oracle11.2 cx_oracle6.0 show problem C:UserstangPycharmProjectsuntitled2>python manage.py migrate Operations to perform: Apply all migrations: admin, auth,......

aisession ⋅ 05/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 37分钟前 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

存储,对比私有云和公有云的不同

导读 说起公共存储,很难不与后网络公司时代的选择性外包联系起来,但尽管如此,它还是具备着简单和固有的可用性。公共存储的名字听起来也缺乏专有性,很像是把东西直接堆放在那里而不会得到...

问题终结者 ⋅ 昨天 ⋅ 0

C++难点解析之const修饰符

C++难点解析之const修饰符 c++ 相比于其他编程语言,可能是最为难掌握,概念最为复杂的。结合自己平时的C++使用经验,这里将会列举出一些常见的难点并给出相应的解释。 const修饰符 const在c...

jackie8tao ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部