內(nèi)置的super()函數(shù)用于調(diào)用父類(超類)的一個(gè)方法。
super 是用來(lái)解決多重繼承問(wèn)題的,直接用類名調(diào)用父類方法在使用單繼承的時(shí)候沒(méi)問(wèn)題,但是如果使用多繼承,會(huì)涉及到查找順序(MRO)、重復(fù)調(diào)用(鉆石繼承)等種種問(wèn)題。
MRO 就是類的方法解析順序表, 其實(shí)也就是繼承父類方法時(shí)的順序表。
在Python中,super()有兩個(gè)主要用例:
使我們避免顯式使用基類名稱
處理多重繼承
在單繼承的情況下,它允許我們通過(guò)引用基類super()。
class Mammal(object): def __init__(self, mammalName): print(mammalName, '是一種溫血?jiǎng)游铩?) class Dog(Mammal): def __init__(self): print('狗有四條腿。') super().__init__('狗') d1 = Dog()
輸出結(jié)果
狗有四條腿。 狗 是一種溫血?jiǎng)游铩?/pre>在這里,我們使用代碼調(diào)用了Mammal類的__init__()方法(來(lái)自Dog類)
super().__init__('Dog')代替
Mammal.__init__(self, 'Dog')由于在調(diào)用成員時(shí)不需要指定基類的名稱,因此可以輕松更改基類名稱(如果需要)。
# 將基類更改為CanidaeFamily class Dog(CanidaeFamily): def __init__(self): print('狗有四條腿。') # 無(wú)需更改此 super().__init__('狗')super()內(nèi)建返回一個(gè)代理對(duì)象,代替對(duì)象,可以通過(guò)委托調(diào)用基類的方法。這稱為間接(使用super()引用基礎(chǔ)對(duì)象的能力)由于間接是在運(yùn)行時(shí)計(jì)算的,因此我們可以在不同時(shí)間使用不同的基類(如果需要)。
示例2:具有多重繼承的super()
class Animal: def __init__(self, Animal): print(Animal, '是動(dòng)物'); class Mammal(Animal): def __init__(self, mammalName): print(mammalName, '是一種溫血?jiǎng)游铩?) super().__init__(mammalName) class NonWingedMammal(Mammal): def __init__(self, NonWingedMammal): print(NonWingedMammal, "不會(huì)飛。") super().__init__(NonWingedMammal) class NonMarineMammal(Mammal): def __init__(self, NonMarineMammal): print(NonMarineMammal, "不會(huì)游泳。") super().__init__(NonMarineMammal) class Dog(NonMarineMammal, NonWingedMammal): def __init__(self): print('狗有4條腿。'); super().__init__('狗') d = Dog() print('') bat = NonMarineMammal('蝙蝠')輸出結(jié)果
狗有4條腿。 狗 不會(huì)游泳。 狗 不會(huì)飛。 狗 是一種溫血?jiǎng)游铩?狗 是動(dòng)物 蝙蝠 不會(huì)游泳。 蝙蝠 是一種溫血?jiǎng)游铩?蝙蝠 是動(dòng)物方法解析順序(MRO)
方法解析順序(MRO)是在存在多個(gè)繼承的情況下應(yīng)繼承方法的順序。您可以使用__mro__屬性查看MRO 。
>>> Dog.__mro__ (<class 'Dog'>, <class 'NonMarineMammal'>, <class 'NonWingedMammal'>, <class 'Mammal'>, <class 'Animal'>, <class 'object'>)這是MRO的工作方式:
派生調(diào)用中的方法總是在基類的方法之前調(diào)用。
在我們的示例中,在NonMarineMammal或NoneWingedMammal之前調(diào)用Dog類。 這兩個(gè)類在Mammal之前調(diào)用,后者在Animal之前調(diào)用,而Animal類在對(duì)象(object)之前調(diào)用。
如果有多個(gè)父類,比如Dog(NonMarineMammal,NonWingedMammal)這樣有多個(gè)父類,則首先調(diào)用NonMarineMammal的方法,因?yàn)樗紫瘸霈F(xiàn)。