📜  Python super()

📅  最后修改于: 2020-09-20 04:36:54             🧑  作者: Mango

内置的super()返回一个代理对象(超类的临时对象),该代理对象允许我们访问基类的方法。

在Python, super()有两个主要用例:

  1. 让我们避免显式使用基类名称
  2. 处理多重继承

示例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__
(, 
, 
, 
, 
, 
)

这是MRO的工作方式:

  1. 派生调用中的方法总是在基类的方法之前调用。在我们的示例中,在NonMarineMammalNoneWingedMammal之前调用Dog类。这两个类在Mammal之前被调用,后者在Animal之前被调用, Animal类在object之前被调用。
  2. 如果像Dog(NonMarineMammal, NonWingedMammal)这样有多个父母,则首先调用NonMarineMammal方法,因为它首先出现。

要了解有关super()更多信息,请访问被认为是super的Python的super()!