Python super ()

Das eingebaute super () gibt ein Proxy-Objekt (temporäres Objekt der Superklasse) zurück, mit dem wir auf Methoden der Basisklasse zugreifen können.

In Python super()gibt es zwei Hauptanwendungsfälle:

  • Ermöglicht es uns, die explizite Verwendung des Basisklassennamens zu vermeiden
  • Arbeiten mit Mehrfachvererbung

Beispiel 1: super () mit Einzelvererbung

Im Fall einer einzelnen Vererbung können wir die Basisklasse nach verweisen 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()

Ausgabe

Hund hat vier Beine. Hund ist ein warmblütiges Tier.

Hier haben wir die __init__()Methode der Mammal-Klasse (aus der Dog-Klasse) mit Code aufgerufen

 super () .__ init __ ('Hund')

Anstatt von

 Säugetier .__ init __ (Selbst, 'Hund')

Da wir den Namen der Basisklasse beim Aufrufen ihrer Mitglieder nicht angeben müssen, können wir den Namen der Basisklasse leicht ändern (falls erforderlich).

 # changing base class to CanidaeFamily class Dog(CanidaeFamily): def __init__(self): print('Dog has four legs.') # no need to change this super().__init__('Dog')

Das super()eingebaute Objekt gibt ein Proxy-Objekt zurück, ein Ersatzobjekt, das Methoden der Basisklasse über die Delegierung aufrufen kann. Dies wird als Indirektion bezeichnet (Fähigkeit, auf das Basisobjekt zu verweisen super()).

Da die Indirektion zur Laufzeit berechnet wird, können wir verschiedene Basisklassen zu unterschiedlichen Zeiten verwenden (falls erforderlich).

Beispiel 2: super () mit Mehrfachvererbung

 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')

Ausgabe

Hund hat 4 Beine. Hund kann nicht schwimmen. Hund kann nicht fliegen. Hund ist ein warmblütiges Tier. Hund ist ein Tier. Fledermaus kann nicht schwimmen. Fledermaus ist ein warmblütiges Tier. Fledermaus ist ein Tier.

Method Resolution Order (MRO)

Method Resolution Order (MRO) ist die Reihenfolge, in der Methoden bei Mehrfachvererbung vererbt werden sollen. Sie können die MRO mithilfe des __mro__Attributs anzeigen .

 >>> Hund .__ mro__ (,,,,,)

So funktioniert MRO:

  • Eine Methode in den abgeleiteten Aufrufen wird immer vor der Methode der Basisklasse aufgerufen.
    In unserem Beispiel wird die Hundeklasse vor NonMarineMammal oder NoneWingedMammal aufgerufen. Diese beiden Klassen werden vor Mammal aufgerufen, was vor Animal aufgerufen wird, und Animal class wird vor dem Objekt aufgerufen.
  • Wenn es mehrere Dog(NonMarineMammal, NonWingedMammal)übergeordnete Elemente gibt, werden die Methoden von NonMarineMammal zuerst aufgerufen, da sie zuerst angezeigt werden.

Um mehr darüber zu erfahren super(), besuchen Sie Pythons super () als super!

Interessante Beiträge...