Python 基礎(chǔ)教程

Python 流程控制

Python 函數(shù)

Python 數(shù)據(jù)類型

Python 文件操作

Python 對(duì)象和類

Python 日期和時(shí)間

Python 高級(jí)知識(shí)

Python 參考手冊(cè)

Python super() 使用方法及示例

Python 內(nèi)置函數(shù)

內(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è)主要用例:

  • 使我們避免顯式使用基類名稱

  • 處理多重繼承

示例1:具有單繼承的super()

在單繼承的情況下,它允許我們通過(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)。

Python 內(nèi)置函數(shù)

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清