简单方法计算Python类的mro (方法解析顺序)

相关概念:

MRO  Method Resolution Order):方法解析顺序。

Python多继承就会涉及到类的继承顺序,虽然我们可以调用类的魔法方法 __mro__打印出来类的继承顺序,但是在我们去面试的时候,大多数是不会给我们一台计算机进行操作的,这里就分享一种快速简单的计算mro顺序的方法!、

 1 class A:
 2     ...
 3 
 4 class B(A):
 5     ...
 6 
 7 class C(A):
 8     ...
 9 
10 class D(B, C):
11     ...
12 
13 class E(C, A):
14     ...
15 
16 class F(D, E):
17     ...
18 
19 class G(E):
20     ...
21 
22 class H(G, F):
23     ...
24 
25 
26 print(H.__mro__)

会打印结果:

  (<class '__main__.H'>, <class '__main__.G'>, <class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

这就是类H的mro顺序!

我的计算方法:

我们虽然很难一下就算出类H的继承顺序,但是我们要算类A、类B、类C的mro顺序便是一眼就能看出来的,然后通过一眼能看出来的顺序,去推断难以看出来的!

1. 类A的 mro:【A, object】

2. 类B的 mro:【B, A, object】

3. 类C的 mro:【C, A, object】

上面三个便是一眼可以看出来的,我们继续向下推,由于 D(B, C),这个继承的先后顺序也是重要的

4. 类D的 mro:【D】+【类B的mro】 + 【类C的mro】,因为类D继承了类B和C,但是这样直接相加两个列表一定是不对的,这里相加的时候有一个规则,就是相同的元素,我们只保留后出现的

重要:相加的时候有一个规则,就是相同的元素,我们只保留后出现的

5. 类D的 mro:【D】+【B, A, object】+ 【C, A, object】,由于有两个相同的类A和类object,我们只保留后面出现的,前面的直接删除,得到结果【D, B, C, A, object】

重要:相加的时候先后顺序一定要和该类继承父类的顺序保持一致,这里D类先继承的B,然后是C,所以相加的时候B在前,C在后,相同元素之保留后面出现的

6. 同理,类E的 mro:【E】+【类C的mro】+【类A的mro】= 【E】+【C, A, object】+【A,object】= 【E,C,A,object】

7. 类F的 mro:【F】+ 【D, B, C, A, object】+【E,C,A,object】=【F,D,B,E,C,A,object】

8. 类G的 mro:【G】+【E,C,A,object】=【G,E,C,A,object】

9. 类H的 mro:【H】+【G,E,C,A,object】+【F,D,B,E,C,A,object】=【H,G, F,D,B,E,C,A,object】

最终可以快速计算出某个类的mro顺序!

如果问我这个方法怎么来的,我也不知道,网上可能有稍微类似点的,看多了总结出来的!如果问这个方法准不准确,那就自己多找几个例子验证一下吧!

原文地址:https://www.cnblogs.com/springionic/p/12218429.html