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 类在 NonMarineMammalNoneWingedMammal 之前被调用。这两个类在 Mammal 之前被调用,MammalAnimal 之前被调用,而 Animal 类在 object 之前被调用。
  • 如果有多个父类,如 Dog(NonMarineMammal, NonWingedMammal),则首先调用 NonMarineMammal 的方法,因为它首先出现。

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

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战