1. 程式人生 > >Python高階之多繼承與mro順序

Python高階之多繼承與mro順序

繼承

在子類初始化的時候需要手動呼叫父類的初始化方法進行父類的屬性的構造,不然就不能使用提供的屬性。

單繼承

定義:一個子類只繼承一個父類

呼叫父類的初始化方法:

方法一:
    父類名.__init__(self)
方法二:
    super(類名,self).__init__()  # 只能傳遞父類方法需要的引數, 不能多傳

區別: 兩種方法沒有區別,父類方法只會被呼叫一次

多繼承

定義: 一個子類同時繼承自多個父類,又稱菱形繼承、鑽石繼承。

呼叫父類的初始化方法:

方法一:
    父類名.__init__(self)
方法二:
    super(類名,self).__init__(
) # 必須傳遞所有的引數

區別:方法一中父類方法會被呼叫多次,方法二中父類方法只會被呼叫一次

MRO順序

多繼承情況下,父類的屬性會被構造多次。為了解決這個問題,Python官方採用了一個演算法將複雜結構上所有的類全部都對映到一個線性順序上,而根據這個順序就能夠保證所有的類都會被構造一次。這個順序就是MRO順序

檢視MRO順序

類名.__mro__()

super的本質就是通過self,確定MRO順序。再通過類名,找到當前類在MRO的位置,再返回MRO中的下一個類作為super呼叫的父類。

總結

  1. MRO保證了多繼承情況 每個類只出現一次
  2. super().__init__相對於類名.__init__
    ,在單繼承上用法基本無差
  3. 但在多繼承上有區別,super方法能保證每個父類的方法只會執行一次,而使用類名的方法會導致方法被執行多次
  4. 多繼承時,使用super方法,對父類的傳引數,應該是由於python中super的演算法導致的原因,必須把引數全部傳遞,否則會報錯
  5. 單繼承時,使用super方法,則不能全部傳遞,只能傳父類方法所需的引數,否則會報錯