當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


Python super()用法及代碼示例

在本教程中,我們將借助示例了解 Python super() 函數。

super() 內置函數返回一個代理對象(超類的臨時對象),它允許我們訪問基類的方法。

示例

class Animal(object):
  def __init__(self, animal_type):
    print('Animal Type:', animal_type)
    
class Mammal(Animal):
  def __init__(self):

    # call superclass
    super().__init__('Mammal')
    print('Mammals give birth directly')
    
dog = Mammal()

# Output: Animal Type: Mammal
#         Mammals give birth directly

使用super()

在 Python 中,super() 有兩個主要用例:

  • 允許我們避免顯式使用基類名稱
  • 使用多重繼承

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

在單繼承的情況下,我們使用super()來引用基類。

class Mammal(object):
  def __init__(self, mammalName):
    print(mammalName, 'is a warm-blooded animal.')
    
class Dog(Mammal):
  def __init__(self):
    print('Dog has four legs.')
    super().__init__('Dog')
    
d1 = Dog()

輸出

Dog has four legs.
Dog is a warm-blooded animal.

在這裏,我們使用代碼調用了Mammal 類(來自Dog 類)的__init__() 方法

super().__init__('Dog')

代替

Mammal.__init__(self, 'Dog')

由於我們在調用其成員時不需要指定基類的名稱,因此我們可以輕鬆更改基類名稱(如果需要)。

# changing base class to CanidaeFamily
class Dog(CanidaeFamily):
  def __init__(self):
    print('Dog has four legs.')

    # no need to change this
    super().__init__('Dog')

super() 內置函數返回一個代理對象,一個可以通過委托調用基類方法的替代對象。這稱為間接(使用 super() 引用基礎對象的能力)

由於間接是在運行時計算的,我們可以在不同的時間使用不同的基類(如果需要的話)。

示例 2:super() 具有多重繼承

class Animal:
  def __init__(self, Animal):
    print(Animal, 'is an animal.');

class Mammal(Animal):
  def __init__(self, mammalName):
    print(mammalName, 'is a warm-blooded animal.')
    super().__init__(mammalName)
    
class NonWingedMammal(Mammal):
  def __init__(self, NonWingedMammal):
    print(NonWingedMammal, "can't fly.")
    super().__init__(NonWingedMammal)

class NonMarineMammal(Mammal):
  def __init__(self, NonMarineMammal):
    print(NonMarineMammal, "can't swim.")
    super().__init__(NonMarineMammal)

class Dog(NonMarineMammal, NonWingedMammal):
  def __init__(self):
    print('Dog has 4 legs.');
    super().__init__('Dog')
    
d = Dog()
print('')
bat = NonMarineMammal('Bat')

輸出

Dog has 4 legs.
Dog can't swim.
Dog can't fly.
Dog is a warm-blooded animal.
Dog is an animal.

Bat can't swim.
Bat is a warm-blooded animal.
Bat is an animal.

方法解析順序 (MRO)

方法解析順序 (MRO) 是在存在多重繼承的情況下應該繼承方法的順序。您可以使用__mro__ 屬性查看MRO。

>>> Dog.__mro__
(<class 'Dog'>, 
<class 'NonMarineMammal'>, 
<class 'NonWingedMammal'>, 
<class 'Mammal'>, 
<class 'Animal'>, 
<class 'object'>)

以下是 MRO 的工作原理:

  • 派生調用中的方法總是在基類的方法之前調用。
    在我們的示例中,Dog類在之前被調用NonMarineMammal或者NoneWingedMammal.這兩個類之前被調用Mammal, 之前調用過Animal, 和Animal類在object.
  • 如果有多個像 Dog(NonMarineMammal, NonWingedMammal) 這樣的父級,則首先調用 NonMarineMammal 的方法,因為它首先出現。

要了解有關 super() 的更多信息,請訪問 Python's super() considered super!

相關用法


注:本文由純淨天空篩選整理自 Python super()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。