在本教程中,我們將借助示例了解 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 sum()用法及代碼示例
- Python scipy.ndimage.binary_opening用法及代碼示例
- Python scipy.signal.windows.tukey用法及代碼示例
- Python scipy.stats.mood用法及代碼示例
- Python scipy.fft.ihfftn用法及代碼示例
- Python scipy.stats.normaltest用法及代碼示例
- Python scipy.ndimage.convolve1d用法及代碼示例
- Python scipy.stats.arcsine用法及代碼示例
- Python scipy.interpolate.UnivariateSpline.antiderivative用法及代碼示例
- Python scipy.linalg.hadamard用法及代碼示例
- Python sympy.rf()用法及代碼示例
- Python scipy.special.inv_boxcox1p用法及代碼示例
- Python sympy.stats.GammaInverse()用法及代碼示例
- Python scipy.stats.zipfian用法及代碼示例
- Python sympy.integrals.transforms.mellin_transform()用法及代碼示例
- Python sympy.replace()用法及代碼示例
- Python scipy.stats.sampling.TransformedDensityRejection用法及代碼示例
- Python scipy.sparse.lil_array.nonzero用法及代碼示例
- Python sympy from_rgs()用法及代碼示例
- Python scipy.signal.ZoomFFT用法及代碼示例
注:本文由純淨天空篩選整理自 Python super()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。