Python3里面,有多继承的时候,往往会出现调用Super失败的情况。Python里存在一种多继承 Super的调用顺序(C3算法),保证每个类调用一次。

体现:类名.__mro__

使用Super时,调用当前类的下一个类的方法

多次调用:

class Parent(object):
def __init__(self,name):
print('parent 开始调用')
self.name = name
print('Parent 调用完成') class Son1(Parent):
def __init__(self,name,age):
print('Son1 调用')
self.age = age
Parent.__init__(self,name)
print('Son1 调用完成') class Son2(Parent):
def __init__(self,name,gender):
print('Son2 调用')
self.gender = gender
Parent.__init__(self, name)
print('Son2 调用完成') class Grandson(Son1,Son2):
def __init__(self,name,gender,age):
print('Grandson 调用')
self.gender = gender
self.age = age
Son1.__init__(self,name,age) #单独调用父类方法
Son2.__init__(self,name,gender)
print('Grandson 调用完成')
s = Grandson('123','男',19) """
Grandson 调用
Son1 调用
parent 开始调用
Parent 调用完成
Son1 调用完成
Son2 调用
parent 开始调用
Parent 调用完成
Son2 调用完成
Grandson 调用完成
"""

防止调用父类调用多次

class Parent(object):
def __init__(self,name,*args,**kwargs):
print('parent 开始调用')
self.name = name
print('Parent 调用完成') class Son1(Parent):
def __init__(self,name,age,*args,**kwargs):
print('Son1 调用')
self.age = age
super().__init__(self,name,*args,**kwargs)
print('Son1 调用完成') class Son2(Parent):
def __init__(self,name,gender,*args,**kwargs):
print('Son2 调用')
self.gender = gender
super().__init__(self,name,*args,**kwargs)
print('Son2 调用完成') class Grandson(Son1,Son2):
def __init__(self,name,gender,age):
print('Grandson 调用')
self.gender = gender
self.age = age
super().__init__(name,gender,age) # == super(Grandson, self).__init__(name,gender)
print('Grandson 调用完成') s = Grandson('123','男',19)
"""
Grandson 调用
Son1 调用
Son2 调用
parent 开始调用
Parent 调用完成
Son2 调用完成
Son1 调用完成
Grandson 调用完成"""

在 Python 中用到多继承时,调用父类方法很容易出错:父类方法调用了多次,只能通过__mro__魔法方法来获取调用顺序

print(Grandson.__mro__) #查看调用顺序
"""
(<class '__main__.Grandson'>,
<class '__main__.Son1'>,
<class '__main__.Son2'>,
<class '__main__.Parent'>,
<class 'object'>)
""" #super().__init__(name,gender,age) == super(Grandson, self).__init__(name,gender) super(Son1,self).__init__(name,age,gender) """
Grandson 调用
Son2 调用
parent 开始调用
Parent 调用完成
Son2 调用完成
Grandson 调用完成
"""

MRO的更多相关文章

  1. Python的方法解析顺序(MRO)

    mro即method resolution order,主要用于在多继承时判断调的属性的路径(来自于哪个类). http://blog.csdn.net/imzoer/article/details/ ...

  2. Python的方法解析顺序(MRO)[转]

    本文转载自: http://hanjianwei.com/2013/07/25/python-mro/ 对于支持继承的编程语言来说,其方法(属性)可能定义在当前类,也可能来自于基类,所以在方法调用时就 ...

  3. 微软的R语言发行版本MRO及开发工具RTVS

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:微软在收购R语言的开发商后,也独立发行或在自己的产品中集成了R语言,这里就介绍下它们包 ...

  4. sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO

    sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO 今天在弄一个 sqlalchemy 的数据库基类的时候,遇到了跟多继承相关的一个小问题,因此顺便看了一 ...

  5. Python 之 super & MRO (没有遇到过适用场景)

    WOW!!! 这里wow的是真尼玛绕且没看完, 好困呐,贴上网址,等自己英文好一点再看(https://rhettinger.wordpress.com/2011/05/26/super-consid ...

  6. 关于TD-LTE网络MRO分析中的一些疑问

    1.eNB天线到达角(LteScAOA)超出正常值范围 在OMC-R测量报告技术要求中此字段的定义为: "定义了一个用户相对参考方向的估计角度.测量参考方向应为正北,逆时针方向.可以辅助确定 ...

  7. python类中的super,原理如何?MRO是什么东东?

    下面这个URL解释得比较清楚. http://python.jobbole.com/86787/?utm_source=group.jobbole.com&utm_medium=related ...

  8. 【转】你真的理解Python中MRO算法吗?

    你真的理解Python中MRO算法吗? MRO(Method Resolution Order):方法解析顺序. Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多 ...

  9. python 零散记录(七)(下) 新式类 旧式类 多继承 mro 类属性 对象属性

    python新式类 旧式类: python2.2之前的类称为旧式类,之后的为新式类.在各自版本中默认声明的类就是各自的新式类或旧式类,但在2.2中声明新式类要手动标明: 这是旧式类为了声明为新式类的方 ...

  10. 采购术语PR、PO、RFQ、RFI、SOW、BOM、JIT、VMI、MRO 是什么意思

    PO:Purchase Order Form 采购订单,公司对外使用,还有个PR: ,公司内部使用的采购申请单 PR (Purchase Requirent) 请购单,采购申请单,代表企业内部的申请需 ...

随机推荐

  1. oo第12次作业

    一.规格化设计发展历史 在上世纪60年代,由于程序猿们难以忍受超级难懂的机器语言和稍微好懂一点点的汇编语言,便发明了结构化的程序语言,使得程序猿们能愉快地编写复杂程度适中的程序.但是需求是在不断增长的 ...

  2. AX_DataSource

    for (custInvoiceJourLocal = custInvoiceJour_ds.getFirst(true) ? custInvoiceJour_ds.getFirst(true) :  ...

  3. 创建和管理SQL Server数据库

    1.创建数据库 右击“数据库”,在弹出的快捷菜单中选择“新建数据库”选项 2.分离和附加数据库 分离:右击数据库"MySchool",在弹出的快捷菜单中选择“任务”—“分离”选项 ...

  4. bootstrap table使用参考

    https://www.cnblogs.com/landeanfen/p/5821192.html  转载 阅读目录 一.x-editable组件介绍 二.bootstrapTable行内编辑初始方案 ...

  5. 【慕课网实战】八、以慕课网日志分析为例 进入大数据 Spark SQL 的世界

    用户行为日志:用户每次访问网站时所有的行为数据(访问.浏览.搜索.点击...)     用户行为轨迹.流量日志   日志数据内容: 1)访问的系统属性: 操作系统.浏览器等等 2)访问特征:点击的ur ...

  6. [swarthmore cs75] Lab 0 Warmup & Basic OCaml

    课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了相关的课堂笔记以及第1次大作业. 什么是编译 编译就是执行Program->Program'转换的过程,如下 ...

  7. artTemplate使用

    bower install artTemplate --save https://github.com/aui/artTemplate 快速上手 模板定义:   <div id="co ...

  8. css中文字超出文本框,溢出部分用点点点表示

        text-overflow 属性规定当文本溢出包含元素时发生的事情.我们可以使用它来对文本超出的部分进行样式的处理. text-overflow: clip|ellipsis|string;包 ...

  9. EF学习笔记(十一):实施继承

    学习总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上篇链接:EF学习笔记(十) 处理并发 本篇原文链接:Implementing Inheritance 面向对象的世界里, ...

  10. 安装MySQL5.7.19 网上的文章参考 并做了部分修改

    1,从官方网址下载MySQL5.7.19源码包 http://dev.MySQL.com/downloads/mysql/#downloads     2,安装好CentOS6.7 64位操作系统. ...