python mro文件_Python MRO

文中代码基于Python3.7

对于Python中的多继承情况,运行时在搜索对象的属性或方法时,需要遵循一定的顺序规则,这个规则称为:Method Resolution Order (MRO).

MRO规则可以总结为以下三句话:

In the multiple inheritance scenario, any specified attribute is searched first in the current class. If not found, the search continues into parent classes in depth-first, left-right fashion without searching the same class twice.

So, first it goes to super class (and its super classes) given first in the list then second super class (and its super classes) , from left to right order. Then finally Object class, which is a super class for all classes.

这里的list指的是多个父类组成的list,如:

class M(X,Y,Z):

pass

list就是(X,Y,Z)

When in MRO we have a super class before subclass then it must be removed from that position in MRO.

这一句和第一句对应起来看,一个类只被检索一次,所以基类要往后移

可以调用类型对象的mro方法或者__mro__属性来获取类型的MRO信息。

classX:defhello(self):print('x')

​classY:defhello(self):print('y')defworld(self):print('y_world')

​classZ:defhello(self):print('z')

​classA(X):defhello(self):print('a')

​classB(Y,Z):defhello(self):print('b')

​classM(B, A):pass​print(M.mro())print(M.__mro__)

​#输出:#list类型

[, , , , , , ]#tuple类型

(, , , , , , )

MRO图示如下:

goes to super class (and its super classes) given first in the list then second super class (and its super classes) , from left to right order. Then finally Object class

depth-first, left-right fashion without searching the same class twice,得到MRO列表:[, , , , , , ]

B和A均继承自Z,M继承自B和A:

classX:defhello(self):print('x')

​classY:defhello(self):print('y')defworld(self):print('y_world')

​classZ:defhello(self):print('z')

​classA(X,Z):defhello(self):print('a')

​classB(Y,Z):defhello(self):print('b')

​classM(B, A):pass​print(M.mro())

​#输出:#[, , , , , , ]

MRO图示如下:

goes to super class (and its super classes) given first in the list then second super class (and its super classes) , from left to right order. Then finally Object class

depth-first, left-right fashion without searching the same class twice,得到MRO列表:[, , , , , , ]

classX:defhello(self):print('x')

​classY:defhello(self):print('y')defworld(self):print('y_world')

​classZ:defhello(self):print('z')

​classA(X,Z):defhello(self):print('a')

​classB(Y,Z):defhello(self):print('b')

​classM(B, A, Y):pass​print(M.mro())

​#输出#[, , , , , , ]

MRO图示如下:

goes to super class (and its super classes) given first in the list then second super class (and its super classes) , from left to right order. Then finally Object class

这个MRO图可以继续简化:

depth-first, left-right fashion without searching the same class twice

得到MRO列表为[, , , , , , ]

When in MRO we have a super class before subclass then it must be removed from that position in MRO

下面是一个会报错的示例:

classA:defprocess(self):print('A process()')

​classB(A):defprocess(self):print('B process()')

​classM(A, B):pass​print(M.mro())

​#输出:#TypeError: Cannot create a consistent method resolution#order (MRO) for bases A, B

MRO图示:

如果一个方法或属性同时存在与B和A,应为M直接继承B又直接继承A,那么通过M来调用时就不知道是该从B中还是A中获取这个方法或属性了,干脆就报错吧。我觉得MRO顺序应该为:M->B->A->object。

推荐阅读

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,每个类都有一个特殊的属性__mro__,它表示了方法解析顺序(Method Resolution Order),即在多继承中方法的查找顺序。__mro__是一个元组,按照从左到右的顺序列出了类的继承顺序。 在经典类的深度遍历中,方法解析顺序是按照继承顺序从左到右进行搜索的。而在Python 2.2的新式类中,方法解析顺序是预先计算的。而在Python 2.3之后的新式类中,采用了C3算法来确定方法解析顺序。C3算法是Python 3唯一支持的方式。 C3算法的目的是解决Python 2.2中方法解析顺序存在的问题。在Python 2.3及以后的版本中,如果存在具有二义性的继承关系,将会产生一个异常,禁止创建这样的类。 所以,如果你想知道一个类的方法解析顺序,你可以查看它的__mro__属性。例如,在Python中执行以下代码: ``` class A: pass class B: pass class C(A, B): pass print(C.__mro__) ``` 将会输出一个元组,按照方法解析顺序列出了C类的继承顺序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python的方法解析顺序(MRO)[转]](https://blog.csdn.net/weixin_30756499/article/details/98422260)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值