Python3 super與mro表

1.MRO表

    返回類型方法順序的解析表python

C3算法計算:算法

    class B(O)  --> mro(B)  =  [B, O]oop

    class B(A1, A2, ...)  -->  mro(B)  = [B] + merge(mro(A1), mro(A2), ... , [A1, A2, ...])ui

    順序遍歷列表spa

    首元素知足如下條件,不然遍歷下一個序列code

        在其餘序列也是首元素對象

        在其餘序列裏不存在繼承

    從全部序列中移除此元素,合併到MRO序列中class

    重複執行,直到全部序列爲空或沒法執行下去require

經過樹理解:

若是有如下繼承關係:

object
     /   \
    /      A
   |     /   \
  B-1  C-2   D-2
    \   /    /
     E-1    /
        \  /
          F

F的MRO表的計算過程就是:

L(O) = O
L(B) = B O
L(A) = A O
L(C) = C A O
L(D) = D A O
L(E) = E + merge(L(B),L(C)) # merger順序是繼承順序
     = E + merge(BO,CAO) # B的父類是O,C的父類A的父類O,B和C同層繼承,因爲E繼承B和C時,B在A前
     = E + B + merge(O,CAO)
     = E + B + C + merge(O,AO)
     = E + B + C + A + merge(O,O)
     = E B C A O
L(F) = F + merge(L(E),L(D))
     = F + merge(EBCAO,DAO)  # EBC在DAO中不存在
     = F + EBC + merge(AO,DAO) # A在DAO中存在,D在AO中不存在
     = F + EBC + D + merge(AO,AO) # 同時移除AO
     = F EBC D AO

MRO:

F -> E -> B -> C -> D -> A -> object

MRO計算原則有:

    1.基類永遠在派生類後面

    2.類繼承的順序影響MRO的順序

繼承時要知足MRO表,不然拋出沒法寫入MRO表異常

2.super

    在調用父類方法的過程當中,由於繼承,子類要先初始化父類的方法,就會致使調用父類的方法會多調用父類的父類的方法

    使用super方法調用,能夠避免

super() -> same as super(__class__, <first argument>)
super(type, obj) -> bound super object; requires isinstance(obj, type)
super(type) -> unbound super object
super(type, type2) -> bound super object; requires issubclass(type2, type)
Typical use to call a cooperative superclass method

  super經過返回指代type下一個父類的super對象,進行調用父類方法

  super方法相似於:

def super(cls, inst):
    mro = inst.__class__.mro()
    return mro[mro.index(cls) + 1]

  經過MRO表往下指代

相關文章
相關標籤/搜索