Python的方法解析顺序(MRO)

mro即method resolution order,主要用于在多继承时判断调的属性的路径(来自于哪个类)。

http://blog.csdn.net/imzoer/article/details/8737642

你真的理解Python中MRO算法吗?

API:

 1 class type(object):
 2     """
 3     type(object) -> the object‘s type
 4     type(name, bases, dict) -> a new type
 5     """
 6     def mro(self): # real signature unknown; restored from __doc__
 7         """
 8         mro() -> list
 9         return a type‘s method resolution order
10         """
11         return []

测试代码:

 1 #!/usr/bin/env python
 2 class A(object):
 3     def __init__(self):
 4         print "enter A"
 5         print("leave A")
 6
 7
 8 class B(object):
 9     def __init__(self):
10         print "enter B"
11         print "leave B"
12
13
14 class C(A,B):
15     def __init__(self):
16         print "enter C"
17         super(C, self).__init__()
18         print "leave C"
19
20 b = C()
21 mo = b.__class__.mro()
22 print mo

输出:

enter C
enter A
leave A
leave C
[<class ‘__main__.C‘>, <class ‘__main__.A‘>, <class ‘__main__.B‘>, <type ‘object‘>]

时间: 2024-12-28 09:03:07

Python的方法解析顺序(MRO)的相关文章

Method Resolution Order – Python类的方法解析顺序

在支持多重继承的编程语言中,查找方法具体来自那个类时的基类搜索顺序通常被称为方法解析顺序(Method Resolution Order),简称MRO.(Python中查找其它属性也遵循同一规则.)对于只支持单重继承的语言,MRO十分简单:但是当考虑多重继承的情况时,MRO算法的选择非常微妙.Python先后出现三种不同的MRO:经典方式.Python2.2 新式算法.Python2.3 新式算法(也称作C3).Python 3中只保留了最后一种,即C3算法. 经典类采用了一种简单MRO机制:查

Python多继承解析顺序的C3线性算法流程解析

Python多继承MRO 在Python2.1中,采用了经典类,使用深度优先算法解析. Python2.2中,引入了新式类,使用深度优先算法和广度优先算法. 在Python2.3以后的版本中,经典类和新式类共存,使用了DFS算法和C3算法. Python2中的经典类 class A(object): pass Python3的新式类 class A: pass C3算法 In computing, the C3 superclass linearization is an algorithm u

Python进阶-继承中的MRO与super

摘要本文讲述Python继承关系中如何通过super()调用"父类"方法,super(Type, CurrentClass)返回CurrentClass的MRO中Type的下一个类的代理:以及如何设计Python类以便正确初始化. 1. 单继承中父类方法调用 在继承中,调用父类方法是很有必要的.调用父类方法的场景有很多: 比如必须调用父类的构造方法__init__才能正确初始化父类实例属性,使得子类实例对象能够继承到父类实例对象的实例属性: 再如需要重写父类方法时,有时候没有必要完全摒

Python中用ElementTree解析XML

[XML基本概念介绍] XML 指可扩展标记语言(eXtensible Markup Language). XML 被设计用来传输和存储数据. 概念一: <foo> # foo元素的起始标签 </foo> # foo元素的结束标签 # note: 每一个起始标签必须有对应的结束标签来闭合, 也可以写成<foo/> 概念二: <foo> # 元素可以嵌套到任意参次 <bar></bar> # bar元素为foo元素的子元素 </f

Method Resolve Order (MRO) - 类对象属性的解析顺序

Method Resolve Order (MRO) - 类对象属性的解析顺序 Python 支持多重继承, 此时就需要解决按照何种顺序来解析属性的问题.类的继承关系在一个特殊的类属性中指定(__mro__).这个属性的作用是按照序列出类及其超类, python 会按照这个顺利搜索方法.任何实现了多重继承的语言都要处理潜在的命名冲突问题,这种冲突由不相关的父类实现的同名方法所引起的,称为'菱形问题'. 举个例子, 1 class A(list): 2 def disp(self): 3 prin

python魔法方法、构造函数、序列与映射、迭代器、生成器

在Python中,所有以__双下划线包起来的方法,都统称为"魔术方法".比如我们接触最多的__init__,魔法方法也就是具有特殊功能的方法. 构造函数 构造函数不同于普通方法,将在对象创建后自动调用它们.也就是在对象创建完成后,自动会调用__init__方法来初始化. 创建一个构造方法 构造方法传参 >>> class FooBar: def __init__(self,value=42): #默认参数 self.somevar = value >>&g

Python 面向对象 之 多继承 MRO

关于子类的继承. 在子类初始化的时候, 是需要手动调用父类的初始化方法来说明的, 语法为: **父类名.__ init__(self, ...)** 多继承 - Bug 这里主要演示一个, 多继承会出现的问题, 其实也不算bug吧, 原理我也没有仔细去推敲过哈, 先露出来看看吧. class 父亲: def __init__(self, name): self.name = name print("i am you father...") class 长子(父亲): def __ini

清除浮动方法解析

清除浮动方法解析 清除浮动带来的额外影响 如果对于浮动不熟悉的同学,可以看看介绍float的文章.传送门:CSS float 我们知道,在一个父元素内如果遇到某个浮动元素,此时父元素的高度会发生塌陷.针对父元素高度塌陷的问题,现在已经有了很多的解决方案.针对每一个方案,我们来进行深度的剖析. 添加空块级元素 这种方法比较容易,但是要注意的是这个空元素必须是一个块级元素,不能是行内元素或者是行内块元素.缺点就是多了一些没有意义的标签.代码如下. //HTML <div class="cont

python命令行解析工具argparse模块【1】

argpaser是python中很好用的一个命令行解析模块,使用它我们可以很方便的创建用户友好型命令行程序.而且argparse会自动生成帮助信息和错误信息. 一.示例 例如下面的例子,从命令行中获取几个整数,然后获取它们的和或者最大值. import argparse parser = argparse.ArgumentParser(description='Process some integers.') parser.add_argument('integers', metavar='N'