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的更多相关文章

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

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

  2. 你真的理解Python中MRO算法吗?[转]

    [前言] MRO(Method Resolution Order):方法解析顺序.Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多问题,比如二义性,Python中 ...

  3. Python之MRO及其C3算法

    [<class '__main__.B'>, <class '__main__.A'>, <class 'object'>] (<class '__main_ ...

  4. Python中的MRO(方法解析顺序)[转载]

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

  5. python2.7高级编程 笔记二(Python中的描述符)

    Python中包含了许多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装饰器(decorator).对于大部分特性来说,这些" ...

  6. python 中的metaclass和baseclasses

    提前说明: class object  指VM中的class 对象,因为python一切对象,class在VM也是一个对象,需要区分class对象和 class实例对象. class instance ...

  7. Python中的__init__和__new__介绍

    介绍 首先我们要知道在面向对象编程中,实例化基本遵循创建实例对象.初始化实例对象.最后返回实例对象这么一个过程. Python 中的 __new__ 方法负责创建一个实例对象,__init__ 方法负 ...

  8. python中基于descriptor的一些概念

    python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2.2.1 静态方法 2.2.2 类方法 2.3 新式类(n ...

  9. python中使用多继承

    python中使用多继承,会涉及到查找顺序(MRO).重复调用(钻石继承,也叫菱形继承问题)等 MRO MRO即method resolution order,用于判断子类调用的属性来自于哪个父类.在 ...

随机推荐

  1. FBXImport

    using UnityEditor; public class MyEditor : AssetPostprocessor{ public void OnPreprocessModel() { Mod ...

  2. win7系统扩展双屏幕时,怎样在两个屏幕下都显示任务栏

    扩展屏幕下都显示任务栏!!! win7系统本身无法设置该功能(眼下我是不知道) 但能够下载第三方软件来解决该问题. 第一步:Dual Monitor Taskbar 下载软件 下载链接:http:// ...

  3. css解决方案之css布局

    固定宽度布局解决方案 固定宽度的居中布局 首先我们这里探讨的是我们常用的固定宽度的居中布局,这应该是目前实战中应用的最多的了. 然后从考虑是否应用大背景上我们分为两种,一种是允许整体有一个大背景,一种 ...

  4. CSS3 稳固而知新: 居中

    水平居中 transform: translateX(-50%); left: 50%; 垂直居中同理 transform: translateY(-50%);   top:50%;     垂直水平 ...

  5. silverlight RadGridView总结二(转载)

    系列二    实现RadGridView行中添加不同控件,并在控件中绑定不同的数据源    先上一段前台代码 <telerik:RadGridView Grid.Row="2" ...

  6. NIO之管道 (Pipe)

    Java NIO 管道是2个线程之间的单向数据连接.Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取. 代码使用示例: public static v ...

  7. ubuntu 12.04上安装emacs24

    1.如果安装了emacs23的先删掉 sudo apt-get purge emacs23 2.默认的软件源中没有emacs24,需要添加新源 sudo add-apt-repository ppa: ...

  8. Atitit.获取swing ui 按钮控件的id 与名字 与JPDA 调试体系

    Atitit.获取swing ui 按钮控件的id 与名字 与JPDA 调试体系 1. Swing Inspector是一个Java Swing/AWT用户界面分析和调试工具,功能与firebug类似 ...

  9. less css下载及编绎工具

    http://www.lesscss.net less.js下载 LESS 1.5已经放出Beta 1版本,支持source map等新特性,欢迎尝鲜.详细变更请见更新日志. 生产环境使用建议下载1. ...

  10. Any、AnyObject、as

    Swift中添加了两种类型别名 Any:可表示随意类型,(Int.Double等值类型). AnyObject:可表示随意class类型实例, 一个不论什么对象类型的数组 Any类型: class C ...