相关概念:
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顺序!
如果问我这个方法怎么来的,我也不知道,网上可能有稍微类似点的,看多了总结出来的!如果问这个方法准不准确,那就自己多找几个例子验证一下吧!