zoukankan      html  css  js  c++  java
  • 简单方法计算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顺序!

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

  • 相关阅读:
    addEventListener-第三个参数 useCapture
    介绍(javascript调试)
    Linux_PXE服务器_RHEL7
    Linux_PXE服务器_RHEL7
    Linux_OpenSSH远程连接
    Linux_OpenSSH远程连接
    Python基本语法_强制数据类型转换
    Python基本语法_强制数据类型转换
    Linux_NetworkManager_RHEL7
    Linux_NetworkManager_RHEL7
  • 原文地址:https://www.cnblogs.com/springionic/p/12218429.html
Copyright © 2011-2022 走看看