English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Grundlegende Python-Tutorial

Flusskontrolle in Python

Python Funktion

Python Datentypen

Dateioperationen in Python

Python Objekte und Klassen

Python Datum und Zeit

Hochwertiges Wissen in Python

Python Referenzhandbuch

Verwendung und Beispiel von Python super()

Python-integrierte Funktionen

Der eingebettete super()-Funktion wird verwendet, um eine Methode der Elternklasse (Überklasse) aufzurufen.

super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。

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

  • 使我们避免显式使用基类名称

  • 处理多重继承

示例1:具有单继承的super()

在单继承的情况下,它允许我们通过引用基类super()。

class Mammal(object):
  def __init__(self, mammalName):
    print(mammalName, '是一种温血动物。')
    
class Dog(Mammal):
  def __init__(self):
    print('狗有四条腿。')
    super().__init__('Hund')
    
d1 = Dog()

Ausgabenergebnis

狗有四条腿。
Hund ist ein Warmblüter.

在这里,我们使用代码调用了Mammal类的__init__()方法(来自Dog类)

super().__init__('Dog')

代替

Mammal.__init__(self, 'Dog')

由于在调用成员时不需要指定基类的名称,因此可以轻松更改基类名称(如果需要)。

# 将基类更改为CanidaeFamily
class Dog(CanidaeFamily):
  def __init__(self):
    print('狗有四条腿。')
    # 无需更改此
    super().__init__('Hund')
super()内建返回一个代理对象,代替对象,可以通过委托调用基类的方法。这称为间接(使用super()引用基础对象的能力)

由于间接是在运行时计算的,因此我们可以在不同时间使用不同的基类(如果需要)。

示例2:具有多重继承的super()

class Animal:
  def __init__(self, Animal):
    print(Animal, '是动物');
class Mammal(Animal):
  def __init__(self, mammalName):
    print(mammalName, '是一种温血动物。')
    super().__init__(mammalName)
    
class NonWingedMammal(Mammal):
  def __init__(self, NonWingedMammal):
    print(NonWingedMammal, '不会飞。')
    super().__init__(NonWingedMammal)
class NonMarineMammal(Mammal):
  def __init__(self, NonMarineMammal):
    print(NonMarineMammal, "kann nicht schwimmen.")
    super().__init__(NonMarineMammal)
class Dog(NonMarineMammal, NonWingedMammal):
  def __init__(self):
    print('Hund hat4mit Beinen.');
    super().__init__('Hund')
    
d = Dog()
print('')
bat = NonMarineMammal('Fledermaus')

Ausgabenergebnis

Der Hund hat4mit Beinen.
Hund kann nicht schwimmen.
Hund kann nicht fliegen.
Hund ist ein Warmblüter.
Hund ist ein Tier
Fledermaus kann nicht schwimmen.
Fledermaus ist ein Warmblüter.
Fledermaus ist ein Tier

Methodenauflösungsreihenfolge (MRO)

Die Methodenauflösungsreihenfolge (MRO) ist die Reihenfolge, in der Methoden bei mehreren Vererbungen inhaliert werden sollen. Sie können die __mro__-Eigenschaft verwenden, um das MRO anzuzeigen.

>>> Dog.__mro__
(<class 'Dog'>, 
<class 'NonMarineMammal'>, 
<class 'NonWingedMammal'>, 
<class 'Mammal'>, 
<class 'Animal'>, 
<class 'object'>)

So funktioniert das MRO (Method Resolution Order):

  • Methodenaufrufe in der Vererbung werden immer vor den Methoden der Basisklassen aufgerufen.
    In unserem Beispiel wird die Klasse Dog vor NonMarineMammal oder NonWingedMammal aufgerufen. Beide Klassen werden vor Mammal aufgerufen, das wiederum vor Animal aufgerufen wird, und die Klasse Animal wird vor dem Objekt (object) aufgerufen.

  • Wenn es mehrere Elternklassen gibt, z.B. Dog (NonMarineMammal, NonWingedMammal) mit mehreren Elternklassen, wird zunächst die Methode von NonMarineMammal aufgerufen, da sie zuerst auftritt.

Python-integrierte Funktionen