内置函数 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 之前被调用,Mammal 在 Animal 之前被调用,而 Animal 类在 object 之前被调用。 - 如果有多个父类,如
Dog(NonMarineMammal, NonWingedMammal)
,则首先调用 NonMarineMammal 的方法,因为它首先出现。
要了解更多关于 super()
的信息,请访问 Python 的 super() 被认为是 super!