记一下python的method resolution order(MRO)机制
一直用python都是拿着cookbook和库的文档直接撸,很少会把细节过得那么彻底,遇到问题才会翻文档。
今天看到这个例子的时候我突然触及了我的盲区,我不确定这样的继承层级调用super.foo()会先绑定哪个。因为之前我写的库的类层级并不会这样,所以没有去考究。
既然遇到问题,就要去弄明白、去解决这个问题。看了官方的文档,python在多继承的情况下,会先将父类的继承链路全部放进一个list里面,然后再进行合并,再函数绑定的时候,左前到后遇到第一个匹配的时候直接绑定。
下面po出代码。
class A:
def foo(self):
print("A") class B(A):
def foo(self):
super(B, self).foo()
print("B") class C(B, A):
def foo(self):
super(C, self).foo()
print("C") class D(C):
def foo(self):
super(D, self).foo()
print("D") class E(D, C):
pass a = A()
b = B()
c = C()
d = D()
e = E() a.foo()
print(" ")
b.foo()
print(" ")
c.foo()
print(" ")
d.foo()
print(" ")
e.foo()
答案:

根据文档的计算方法

L(A) = O
L(B) = B A O
L(C) = C merge(BAO,AO,BA) = C B A O
L(D) = D C B A O
L(E) = E + merge(DCBAO,CBAO,DC) = E D C B A O
所以super(type,self).foo()绑定的方法实例就会按照上面的解来得出。
记一下python的method resolution order(MRO)机制的更多相关文章
- python---方法解析顺序MRO(Method Resolution Order)<以及解决类中super方法>
MRO了解: 对于支持继承的编程语言来说,其方法(属性)可能定义在当前类,也可能来自于基类,所以在方法调用时就需要对当前类和基类进行搜索以确定方法所在的位置.而搜索的顺序就是所谓的「方法解析顺序」(M ...
- 【转】python---方法解析顺序MRO(Method Resolution Order)<以及解决类中super方法>
[转]python---方法解析顺序MRO(Method Resolution Order)<以及解决类中super方法> MRO了解: 对于支持继承的编程语言来说,其方法(属性)可能定义 ...
- 转 -- Python: 多继承模式下 MRO(Method Resolution Order) 的计算方式关乎super
大家可能已经知道了,在 Python 3(Python 2 的新式类)中多继承模式是使用 C3 算法来确定 MRO(Method Resolution Order) 的. 那么具体是怎么计算的呢?本文 ...
- Method Resolution Order – Python类的方法解析顺序
在支持多重继承的编程语言中,查找方法具体来自那个类时的基类搜索顺序通常被称为方法解析顺序(Method Resolution Order),简称MRO.(Python中查找其它属性也遵循同一规则.)对 ...
- Method Resolve Order (MRO) - 类对象属性的解析顺序
Method Resolve Order (MRO) - 类对象属性的解析顺序 Python 支持多重继承, 此时就需要解决按照何种顺序来解析属性的问题.类的继承关系在一个特殊的类属性中指定(__mr ...
- CodeChef - MRO Method Resolution Order(打表)
题意:有一种关系叫继承,那么继承父类的同时也会继承他的一个函数f,能继承任意多个父类或不继承,但不能继承自己的子类.现在规定一个列表,这个列表必须以1~N的顺序排列,并且父类不会排在子类后面,1含有一 ...
- Python的方法解析顺序(MRO)[转]
本文转载自: http://hanjianwei.com/2013/07/25/python-mro/ 对于支持继承的编程语言来说,其方法(属性)可能定义在当前类,也可能来自于基类,所以在方法调用时就 ...
- Python的多继承问题-MRO和C3算法
大部分内容转载自C3 线性化算法与 MRO 理解Python中的多继承 Python 中的方法解析顺序(Method Resolution Order, MRO)定义了多继承存在时 Python 解释 ...
- TypeError: Error when calling the metaclass bases Cannot create a consistent method resolution
Python Error when calling the metaclass bases Cannot create a consistent method resolution order (MR ...
随机推荐
- 洛谷P1192-台阶问题(线性递推 扩展斐波那契)
占坑 先贴上AC代码 回头来补坑 #include <iostream> using namespace std; int n, k; const int mod = 100003; lo ...
- Python 加入类型检查
Python 是一门强类型的动态语言, 对于一个 Python 函数或者方法, 无需声明形参及返回值的数据类型, 在程序的执行的过程中, Python 解释器也不会对输入参数做任何的类型检查, 如果程 ...
- N种自动化测试框架(包含自动化和性能,总有一款适合你)
不知不觉,分享的框架已经6个了(准确说应该是4个),仅仅是接口的. 这些框架都是最基础的框架,需要根据实际使用场景进行完善,大家就当练手实践吧. 不需要写代码的自动化框架 JMeter + Ant+ ...
- 09-cmake语法-add_dependencies()
在编译器的命令行上,为当前路径以及下层路径的源文件加入一些define flag.这个命令可以用来引入任何flag,但是它的原意是用来引入预处理器的定义.那些以-D或/D开头的.看起来像预处理器定义的 ...
- arguments简单函数 求整数递加和
function add(n){if(n == 1) return 1;else return n + arguments.callee(n-1);alert(arguments.callee(1)) ...
- 排序算法-归并排序(Java)
package com.rao.sort; import java.util.Arrays; /** * @author Srao * @className MergeSort * @date 201 ...
- django ORM创建
简短的例子 from django.db import models class Person(models.Model): first_name = models.CharField(max_len ...
- Flask的响应及request属性整理
类比django框架,Response三贱客: return HttpResponse: return ‘xxxxxxxxxx’ # 返回字符串 return r ...
- mysql 8创建远程访问用户以及连接mysql速度慢的解决方法
mysql 8创建远程访问用户 [root@demo /]# mysql -u root -p #登录服务器数据库 Enter password:123xxx >user mysql; & ...
- 概率论基础知识(Probability Theory)
概率(Probability):事件发生的可能性的数值度量. 组合(Combination):从n项中选取r项的组合数,不考虑排列顺序.组合计数法则:. 排列(Permutation):从n项中选取r ...