溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python中繼承問題的示例分析

發(fā)布時間:2021-08-17 11:35:43 來源:億速云 閱讀:103 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下Python中繼承問題的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

多繼承問題

1.單獨調(diào)用父類:

一個子類同時繼承自多個父類,又稱菱形繼承、鉆石繼承。

使用父類名.init(self)方式調(diào)用父類時:

例:

class Parent(object):
  def __init__(self, name):
    self.name = name
    print('parent的init結(jié)束被調(diào)用')
class Son1(Parent):
  def __init__(self, name, age):
    Parent.__init__(self, name)
    self.age = age
    print('Son1的init結(jié)束被調(diào)用')
class Son2(Parent):
  def __init__(self, name, gender):
    Parent.__init__(self, name)
    self.gender = gender
    print('Son2的init結(jié)束被調(diào)用')
class Grandson(Son1, Son2):
  def __init__(self, name, age, gender):
    Son1.__init__(self, name, age) # 單獨調(diào)用父類的初始化方法
    Son2.__init__(self, name, gender)
    print('Grandson的init結(jié)束被調(diào)用')
gs = Grandson('grandson', 12, '男')

執(zhí)行結(jié)果:

Python中繼承問題的示例分析

可以看出使用父類名.init(self)方式調(diào)用父類時,parent父類被調(diào)用了兩次,此方法對于多繼承不太合適。

2.MRO順序:

上述代碼,我們發(fā)現(xiàn)由于多繼承情況,parent類被的屬性被構(gòu)造了兩次,如果在更加復(fù)雜的結(jié)構(gòu)下可能更加嚴(yán)重。

為了解決這個問題,Python官方采用了一個算法將復(fù)雜結(jié)構(gòu)上所有的類全部都映射到一個線性順序上,而根據(jù)這個順序就能夠保證所有的類都會被構(gòu)造一次。

這個順序就是MRO順序。

MRO順序采用C3算法廣度優(yōu)先遍歷。

使用方法: 類名.mro()或類名.mro()

Python中繼承問題的示例分析

3.super調(diào)用父類:

使用super().init()方式調(diào)用父類時:

例:

class Parent(object):
  def __init__(self, name, *args, **kwargs): # 為避免多繼承報錯,使用不定長參數(shù),接受參數(shù)
    self.name = name
    print('parent的init結(jié)束被調(diào)用')
class Son1(Parent):
  def __init__(self, name, age, *args, **kwargs): # 為避免多繼承報錯,使用不定長參數(shù),接受參數(shù)
    self.age = age
    super().__init__(name, *args, **kwargs) # 為避免多繼承報錯,使用不定長參數(shù),接受參數(shù)
    print('Son1的init結(jié)束被調(diào)用')
class Son2(Parent):
  def __init__(self, name, gender, *args, **kwargs): # 為避免多繼承報錯,使用不定長參數(shù),接受參數(shù)
    self.gender = gender
    super().__init__(name, *args, **kwargs) # 為避免多繼承報錯,使用不定長參數(shù),接受參數(shù)
    print('Son2的init結(jié)束被調(diào)用')
class Grandson(Son1, Son2):
  def __init__(self, name, age, gender):
    # 多繼承時,相對于使用類名.__init__方法,要把每個父類全部寫一遍
    # 而super只用一句話,執(zhí)行了全部父類的方法,這也是為何多繼承需要全部傳參的一個原因
    # super(Grandson, self).__init__(name, age, gender)
    super().__init__(name, age, gender)
    print('Grandson的init結(jié)束被調(diào)用')
gs = Grandson('grandson', 12, '男')
print(Grandson.__mro__)

運行結(jié)果:

Python中繼承問題的示例分析

parent父類只被調(diào)用了一次,super方法會按照MRO順序調(diào)用下一個父類。

總結(jié):

(1)MRO保證了多繼承情況 每個類只出現(xiàn)一次

(2)super().init相對于類名.init,在單繼承上用法基本無差

(3)但在多繼承上有區(qū)別,super方法能保證每個父類的方法只會執(zhí)行一次,而使用類名的方法會導(dǎo)致方法被執(zhí)行多次

(4)多繼承時,使用super方法,對父類的傳參數(shù),是由于python中super的算法導(dǎo)致的原因,必須把參數(shù)全部傳遞,否則會報錯

(5)單繼承時,使用super方法,不能全部傳遞,只能傳父類方法所需的參數(shù),否則會報錯

(6)多繼承時,相對于使用類名.init方法,要把每個父類全部寫一遍, 而使用super方法,只需寫一句話便執(zhí)行了全部父類的方法,這也是為何多繼承需要全部傳參的一個原因

以上是“Python中繼承問題的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI