Python中MRO
MRO(方法解析顺序)
当有多重继承时,基于“从左到右,深度优先原则”:
class CommonBase():
def Method(self):
print('CommonBase')
class Base1(CommonBase):
pass
class Base2(CommonBase):
def Method(self):
print('Base2')
class MyClass(Base1,Base2):
pass
MyClass().Method()
# 执行结果:CommonBase
当然如上算法时在python2中旧式类中(不继承object)存在这样的算法,当然在python3中定义类的时候已经显示的继承了object(不管你是否写都默认地继承了object)。当然也提供了一个新的MRO算法,在python3中运行如上代码结果为:Base2
python super()调用多重继承函数问题
https://blog.csdn.net/dl_chenbo/article/details/80602113
如上博文也阐明了关于多重继承MRO问题,初次接触肯定有违你的初衷。 明白MRO的算法之后,还要考虑一个问题就是不同种类的参数问题:
class CommonBase:
def __init__(self):
print('CommonBase')
super().__init__()
class Base1(CommonBase):
def __init__(self):
print('Base1')
super().__init__()
class Base2(CommonBase):
def __init__(self,arg):
print('Base2')
super().__init__()
class MyClass(Base1,Base2):
def __init__(self,arg):
print('MyClass')
super().__init__(arg)
MyClass(10)
# 报错如下:
Traceback (most recent call last):
File "E:/QMYG.BLOG/awesome-py3-webapp/test2.py", line 47, in <module>
MyClass(10)
File "E:/QMYG.BLOG/awesome-py3-webapp/test2.py", line 45, in __init__
super().__init__(arg)
TypeError: __init__() takes 1 positional argument but 2 were given
解决如上问题,可以使用arg,*kw接收参数,但是这种设计方式不推荐,任何参数都可以传入使得代码比较脆弱。
最佳实践
- 应该避免多重继承
- super的使用必须一致
- 显示地继承object
- 调用父类时必须查看类的层次结构,通过mro
python私有属性
使用双下划线为前缀,解析器会把该属性重命名,使用组合名称依然可以访问该属性。真正定义私有属性的时候约定使用 _ 前缀,虽然同样可以访问,但不会调用任何名称修饰的算法。
Python中MRO的更多相关文章
- 【转】你真的理解Python中MRO算法吗?
你真的理解Python中MRO算法吗? MRO(Method Resolution Order):方法解析顺序. Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多 ...
- 你真的理解Python中MRO算法吗?[转]
[前言] MRO(Method Resolution Order):方法解析顺序.Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多问题,比如二义性,Python中 ...
- Python之MRO及其C3算法
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>] (<class '__main_ ...
- Python中的MRO(方法解析顺序)[转载]
本文转载至: http://hanjianwei.com/2013/07/25/python-mro/ 对于支持继承的编程语言来说,其方法(属性)可能定义在当前类,也可能来自于基类,所以在方法调用时就 ...
- python2.7高级编程 笔记二(Python中的描述符)
Python中包含了许多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装饰器(decorator).对于大部分特性来说,这些" ...
- python 中的metaclass和baseclasses
提前说明: class object 指VM中的class 对象,因为python一切对象,class在VM也是一个对象,需要区分class对象和 class实例对象. class instance ...
- Python中的__init__和__new__介绍
介绍 首先我们要知道在面向对象编程中,实例化基本遵循创建实例对象.初始化实例对象.最后返回实例对象这么一个过程. Python 中的 __new__ 方法负责创建一个实例对象,__init__ 方法负 ...
- python中基于descriptor的一些概念
python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2.2.1 静态方法 2.2.2 类方法 2.3 新式类(n ...
- python中使用多继承
python中使用多继承,会涉及到查找顺序(MRO).重复调用(钻石继承,也叫菱形继承问题)等 MRO MRO即method resolution order,用于判断子类调用的属性来自于哪个父类.在 ...
随机推荐
- MyTools
using UnityEditor; using UnityEngine; using System.IO; using System.Collections; using System.Collec ...
- 小程序app is not defined
错误记录: 小程序丨 报错:app is not defined; 解决方案: Js头部添加:var app = getApp(); 返回按钮: wx.navigateBack(); 转发 ...
- mui.fire() 和 mui.trigger()
导读:添加自定义事件监听操作和标准js事件监听类似,可直接通过window对象添加,通过mui.fire()方法可触发目标窗口的自定义事件 监听自定义事件 添加自定义事件监听操作和标准js事件监听类似 ...
- c++ 银行管理系统及报告
1.题目描写叙述: 本代码为银行管理系统,总体分为管理员模式和普通用户模式: (1)在管理员模式中能完毕 ①用户信息录入 ②改动管理员password ③改动指定账户信息 ④信息管理业务 (2)在普通 ...
- Qt学习 之 多线程程序设计
QT通过三种形式提供了对线程的支持.它们各自是, 一.平台无关的线程类 二.线程安全的事件投递 三.跨线程的信号-槽连接. 这使得开发轻巧的多线程Qt程序更为easy,并能充分利用多处理器机器的优势. ...
- Datastage装载数据报错 -798 428C9 不能把一个值插入到用GENERATED ALWAYS定义的ROWID列
使用Datastage装载数据到下表中报错. 表结构 INCREMENT ),cst_name )) 报错 解决办法 新建表T_tmp )) 导入到该表后再使用INSERT INTO ...SELEC ...
- 神奇的canvas——巧用 canvas 为图片添加水印
代码地址如下:http://www.demodashi.com/demo/11637.html 很久之前写过一篇关于 canvas 的文章,是通过 canvas 来实现一个绚丽的动画效果,不管看过没看 ...
- 使用zTree插件构建树形菜单
zTree下载:https://github.com/zTree/zTree_v3 目录: 就我看来,zTree较为实用的有以下几点: zTree 是一个依靠 jQuery 实现的多功能 “树插件”. ...
- datagridview 日期列排序
1.datagridview 日期列排序 private void Form1_Load(object sender, EventArgs e) { //方法1 dataGridView1.Colum ...
- ftp获取远程Pdf文件
此程序需要安装ftp服务器,安装adobe reader(我这里使用的adobe reader9.0) 1.部署ftp服务器 将ftp的权限设置为允许匿名访问,部署完成 2.安装adobe reade ...