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. STS中logback.xml配置文件

    <?xml version="1.0" encoding="UTF-8"?> <configuration debug="false ...

  2. EXCEL公式及宏

    VLOOKUP特别好用的一个用于映射的公式 1.需要根据ID找到对应的NAME 2.将可以用于映射的两列放到G,H列中(注意!用于检索的要放在相对的第一列中) 3.VLOOKUP(A2,G:H,2,F ...

  3. C++ STL库的总结以及实现原理

    STL的容器可以分为以下几个大类:一:序列容器, 有vector, list, deque, string. 二 : 关联容器,     有set, multiset, map, mulmap has ...

  4. out与ref以及可空类型用法的用法

    1.ref的用法:传递结构 public class A { public int X{get;set;} } public static void changeA(ref A a) { a.X=2 ...

  5. Appium+Python自动化 2 定位元素方式

    1.找到 Android SDK安装路径tools 下面的 uiautomatorviewer.bat,如下截图 2.点击uiautomatorviewer.bat进行启动,左上角一共四个按钮,作用分 ...

  6. mysql创建新的用户及flush privileges解析

    1.首先以root用户登录到mysql mysql -u root -p 2.接着要知道mysql的用户信息是存储在mysql.user(mysql数据库下的user数据表)下的,所以我们只需添加一个 ...

  7. uiautomatorviewer报错“Error taking device screenshot: EOF” ,

    uiautomatorviewer报错“Error taking device screenshot: EOF”  ,千万不要装手机助手,不要装手机助手,不要装手机助手 uiautomatorview ...

  8. Linux学习---自定义数据类型

    struct   结构体 (地址递增) eg:struct myabc{ unsigned int a; unsigned int b; unsigned int c; unsigned int d; ...

  9. appium手机键盘实现方法

    首先引入appium的webdriver from appium import webdriver 方法1 AppiumDriver实现了在上述功能,代码如下(java版本) driver.sendK ...

  10. 检测MySQL主从备份是否运行

    通过查看 slave  状态,确保 Slave_IO_Running: Yes Slave_SQL_Running: Yes #!/bin/bash#Author:Darius-Dmysql -uro ...