Python super ()

De ingebouwde super () retourneert een proxy-object (tijdelijk object van de superklasse) waarmee we toegang hebben tot methoden van de basisklasse.

super()Heeft in Python twee belangrijke use-cases:

  • Hiermee kunnen we voorkomen dat de naam van de basisklasse expliciet wordt gebruikt
  • Werken met meervoudige overerving

Voorbeeld 1: super () met Single Inheritance

In het geval van een enkele overerving, kunnen we de basisklasse verwijzen naar 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()

Uitvoer

Hond heeft vier poten. De hond is een warmbloedig dier.

Hier hebben we de __init__()methode van de Mammal-klasse (van de Dog-klasse) aangeroepen met behulp van code

 super () .__ init __ ('Hond')

in plaats van

 Mammal .__ init __ (zelf, 'Hond')

Omdat we de naam van de basisklasse niet hoeven op te geven wanneer we de leden aanroepen, kunnen we gemakkelijk de naam van de basisklasse wijzigen (als dat nodig is).

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

De super()ingebouwde retourneert een proxy-object, een vervangend object dat methoden van de basisklasse kan aanroepen via delegatie. Dit wordt indirectie genoemd (mogelijkheid om naar een basisobject te verwijzen super())

Omdat de indirecte berekening tijdens de runtime wordt berekend, kunnen we verschillende basisklassen op verschillende tijdstippen gebruiken (als dat nodig is).

Voorbeeld 2: super () met meervoudige overerving

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

Uitvoer

Hond heeft 4 poten. De hond kan niet zwemmen. De hond kan niet vliegen. De hond is een warmbloedig dier. De hond is een dier. Bat kan niet zwemmen. Bat is een warmbloedig dier. Bat is een dier.

Method Resolution Order (MRO)

Method Resolution Order (MRO) is de volgorde waarin methoden moeten worden geërfd in de aanwezigheid van meervoudige overerving. U kunt de MRO bekijken door het __mro__attribuut te gebruiken.

 >>> Hond .__ mro__ (,,,,,)

Hier is hoe MRO werkt:

  • Een methode in de afgeleide aanroepen wordt altijd aangeroepen vóór de methode van de basisklasse.
    In ons voorbeeld wordt de klasse Dog aangeroepen vóór NonMarineMammal of NoneWingedMammal. Deze twee klassen worden aangeroepen vóór Mammal, dat wordt aangeroepen vóór Animal, en de klasse Animal wordt vóór het object aangeroepen.
  • Als er meerdere ouders zijn Dog(NonMarineMammal, NonWingedMammal), wordt de methode van NonMarineMammal als eerste aangeroepen omdat deze als eerste verschijnt.

Ga voor meer informatie super()naar Python's super () beschouwd als super!

Interessante artikelen...