MRO是用在多重继承中的。考虑这种情况,整个环境中父类是两个 P1,P2 子类是两个 C1,C2 而 孙子类是G1. 我们知道 G1会从 P1,P2,C1,C2中继承属性,但是如果有多个属性重名,那么G1,到底继承哪一个呢? PYTHON这时候会根据MRO去搜索需要的属性,搜索到了第一个,就用这个。所以MRO 顺序是非常重要的。 我们知道python 中的类其实是有经典类和新式类区别的(新式类其实就是在类定义的时候,指定从Object派生),那么对应的MRO也有两种,经典类有自己的MRO,而新式类也有自己的MRO。 看下面的例子。

首先是经典类的MRO

>>> class P1:
... def foo(self):
... print 'this is P1-foo'
...
>>> class P2:
... def foo(self):
... print 'this is P2-foo'
... def bar(self):
... print 'this is P2-bar'
...
>>> class C1(P1,P2):
... pass
...
>>> class C2(P1,P2):
... def bar(self):
... print 'this is C2-bar'
...
>>> class G1(C1,C2):
... pass
...

这样定义完成之后, 几个类之间的关系如下:

我们运行一下GC的函数看一下,

>>> g1=G1()
>>> g1.foo()
this is P1-foo
>>> g1.bar()
this is P2-bar

经典类的MRO是深度优先 从左到右,所以在搜索foo的时候,顺序是 G1->C1->P1。 在搜索C2时候的顺序是 G1->C1->P1->P2。 所以G2的bar就被跳过去了。

我们再看一下新式类的MRO. 其实就是把上面的例子中 P1,P2改成从 object 派生:

>>> g1.foo()
this is P1-foo
>>> g1.bar()
this is C2-bar

这是因为新式类的MRO是广度优先,从左到右,所以搜索foo的时候是 g1->c1->c2->p1 而 搜索 bar的时候是 g1->c1->c2。

MRO 方法解释顺序的更多相关文章

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

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

  2. Python - 面向对象编程 - MRO 方法搜索顺序

    为什么会讲 MRO? 在讲多继承的时候:https://www.cnblogs.com/poloyy/p/15224912.html 有讲到, 当继承的多个父类拥有同名属性.方法,子类对象调用该属性. ...

  3. Python的方法解析顺序(MRO)[转]

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

  4. sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO

    sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO 今天在弄一个 sqlalchemy 的数据库基类的时候,遇到了跟多继承相关的一个小问题,因此顺便看了一 ...

  5. Python的程序结构[2] -> 类/Class[2] -> 方法解析顺序 MRO

    方法解析顺序 / MRO (Method Resolution Order) 关于方法解析顺序(MRO)的详细内容可以参考文末链接,这里主要对 MRO 进行简要的总结说明以及一些练习示例. 经典类和新 ...

  6. python 方法解析顺序 mro

    一.概要: mor(Method Resolution Order),即方法解析顺序,是python中用于处理二义性问题的算法 二义性: 1.两个基类,A和B都定义了f()方法,c继承A和B那么C调用 ...

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

    在支持多重继承的编程语言中,查找方法具体来自那个类时的基类搜索顺序通常被称为方法解析顺序(Method Resolution Order),简称MRO.(Python中查找其它属性也遵循同一规则.)对 ...

  8. mro具体解释

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

  9. AsyncTask内的各个方法调用顺序

    |- AsyncTask内的各个方法调用顺序:|- 首先,用户调用execute方法,启动AsyncTask .然后在execute方法中:|- 首先调用onPreExecute方法,执行初始化操作. ...

随机推荐

  1. [Swift通天遁地]七、数据与安全-(1)XML文档的创建和解析

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  2. RHEL6.5设置行号,安装GCC

    vim ~/.vimrc    set nu    set cindent    set tabstop=4    set shiftwidth=4    syntax on 安装gcc,g++编译器 ...

  3. 判断人员js

    var allchooseEmpID = "";var allchooseEmpName = "";//自选经办人 function getJbrWinForM ...

  4. javascript中for...in和for...of的区别

    for...of循环是ES6引入的新的语法. for...in遍历拿到的x是键(下标).而for...of遍历拿到的x是值,但在对象中会提示不是一个迭代器报错.例子如下: let x; let a = ...

  5. python 画图

    1.根据实际图形,用符号画出原来图形 from PIL import Image import argparse #命令行输入参数处理 parser = argparse.ArgumentParser ...

  6. Dex文件方法数超过65536怎么破?

    你的应用中的Dex 文件方法数超过了最大值65536的上限,会提示你: UNEXPECTED TOP-LEVEL EXCEPTION:java.lang.IllegalArgumentExceptio ...

  7. MySQL的安装和启动

    一.MySQL各类安装方法的比较 在Linux系统下,MySQL有3种主要的安装方式,分别是:RPM安装.二进制安装.源码安装.三种安装方式的优缺点如下表所示:   RPM安装 二进制安装 源码安装 ...

  8. mysql复制数据

    前言:由于工作需要,我要造大量数据,最好的方法是直接copy已有的数据,改其中一些值即可.操作的表有主键,且自增,AUTO_INCREMENT 按照以往的经验无外乎: 类别一. 如果两张张表(导出表和 ...

  9. [转]自适应网页设计(Responsive Web Design)

    本文转自:http://www.ruanyifeng.com/blog/2012/05/responsive_web_design.html 作者: 阮一峰 日期: 2012年5月 1日 随着3G的普 ...

  10. 实现div毛玻璃背景

    毛玻璃效果 ios里毛玻璃效果的使用非常多,本文介绍一个实现div毛玻璃背景的方法 CSS3 Filter CSS3的Filter主要用在图像的特效处理上,默认值为none,还有以下备选项:   1. ...