📅  最后修改于: 2020-09-20 04:36:54             🧑  作者: Mango
在Python, 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()
引用基础对象的能力)
由于间接是在运行时计算的,因此我们可以在不同的时间使用不同的基类(如果需要)。
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。
>>> Dog.__mro__
(,
,
,
,
,
)
这是MRO的工作方式:
NonMarineMammal
或NoneWingedMammal
之前调用Dog
类。这两个类在Mammal
之前被调用,后者在Animal
之前被调用, Animal
类在object
之前被调用。 Dog(NonMarineMammal, NonWingedMammal)
这样有多个父母,则首先调用NonMarineMammal
方法,因为它首先出现。 要了解有关super()
更多信息,请访问被认为是super的Python的super()!