MRO
在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的更多相关文章
- Python的方法解析顺序(MRO)
mro即method resolution order,主要用于在多继承时判断调的属性的路径(来自于哪个类). http://blog.csdn.net/imzoer/article/details/ ...
- Python的方法解析顺序(MRO)[转]
本文转载自: http://hanjianwei.com/2013/07/25/python-mro/ 对于支持继承的编程语言来说,其方法(属性)可能定义在当前类,也可能来自于基类,所以在方法调用时就 ...
- 微软的R语言发行版本MRO及开发工具RTVS
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:微软在收购R语言的开发商后,也独立发行或在自己的产品中集成了R语言,这里就介绍下它们包 ...
- sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO
sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO 今天在弄一个 sqlalchemy 的数据库基类的时候,遇到了跟多继承相关的一个小问题,因此顺便看了一 ...
- Python 之 super & MRO (没有遇到过适用场景)
WOW!!! 这里wow的是真尼玛绕且没看完, 好困呐,贴上网址,等自己英文好一点再看(https://rhettinger.wordpress.com/2011/05/26/super-consid ...
- 关于TD-LTE网络MRO分析中的一些疑问
1.eNB天线到达角(LteScAOA)超出正常值范围 在OMC-R测量报告技术要求中此字段的定义为: "定义了一个用户相对参考方向的估计角度.测量参考方向应为正北,逆时针方向.可以辅助确定 ...
- python类中的super,原理如何?MRO是什么东东?
下面这个URL解释得比较清楚. http://python.jobbole.com/86787/?utm_source=group.jobbole.com&utm_medium=related ...
- 【转】你真的理解Python中MRO算法吗?
你真的理解Python中MRO算法吗? MRO(Method Resolution Order):方法解析顺序. Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多 ...
- python 零散记录(七)(下) 新式类 旧式类 多继承 mro 类属性 对象属性
python新式类 旧式类: python2.2之前的类称为旧式类,之后的为新式类.在各自版本中默认声明的类就是各自的新式类或旧式类,但在2.2中声明新式类要手动标明: 这是旧式类为了声明为新式类的方 ...
- 采购术语PR、PO、RFQ、RFI、SOW、BOM、JIT、VMI、MRO 是什么意思
PO:Purchase Order Form 采购订单,公司对外使用,还有个PR: ,公司内部使用的采购申请单 PR (Purchase Requirent) 请购单,采购申请单,代表企业内部的申请需 ...
随机推荐
- laravel-debugbar安装
第一步:找到debugbar扩展包 扩展包的链接:https://packagist.org/packages/barryvdh/laravel-debugbar 第二步:安装 我测试的环境larav ...
- Lucene学习笔记:基础
Lucence是Apache的一个全文检索引擎工具包.可以将采集的数据存储到索引库中,然后在根据查询条件从索引库中取出结果.索引库可以存在内存中或者存在硬盘上. 本文主要是参考了这篇博客进行学习的,原 ...
- html 页面 判断第一个反应的网站并进行跳转 模仿CDN
<!DOCTYPE html><html><head><meta charset="gb2312"><meta http-eq ...
- kbmmw 5.08 正式发布
欢迎大家围观. Important notes (changes that may break existing code) ============================= ...
- 致C#,致我这工作一年(上)
回忆 最近比较闲,虽然我总是每天会在博客园逛上1~2个钟(最近是真的有点闲),看了很多人对于工作的感悟,谈程序员的职业规划,不知不觉出来工作我也快一年多了,我也想聊聊现在用C#找工作和我这一年多 ...
- 关于浏览器cookie的小知识
浏览器对于总的cookie数量是没有限制的,但是对于每个域名的cookie数量是有限制的. 一,不同的浏览器,对于一个域名的cookie数量限制上限是不同的: 1,IE6以下版本,最多20个.IE7以 ...
- Python开发——11.异常及异常处理
一.异常 1.定义 异常及时程序运行时发生错误的信号 2.种类 异常分为语法错误和逻辑错误,语法错误在程序执行之前就应该改正. 常用异常 AttributeError 试图访问一个对象没有的树形,比如 ...
- nginx报错:./configure: error: C compiler cc is not found, gcc 是已经安装了的
源码安装nginx报错,找不到gcc,但是实际上gcc是存在的,如下: # ./configure checking for OS + Linux -.el7.x86_64 x86_64 checki ...
- IDEA 的黄线标注 取消
用IDEA经常会遇到found duplicate code的问题,下面有黄线标注,严重影响强迫症患者的使用.下面就是如何取消的方法 在设置中把这个勾取消即可1 转载于: https://blog. ...
- java web 开发手册
W3School离线手册(2017.03) 提取密码: b2fo JavaScript高级程序设计第三版 提取密码: cscv CSS4.2.4 参 ...