您好,登錄后才能下訂單哦!
小編給大家分享一下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é)果:
可以看出使用父類名.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()
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é)果:
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è)資訊頻道!
免責(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)容。