Python super ()

Super () indbygget returnerer et proxyobjekt (midlertidigt objekt i superklassen), der giver os adgang til metoder i basisklassen.

I Python super()har to store brugssager:

  • Tillader os at undgå at bruge baseklassenavnet eksplicit
  • Arbejde med flere arv

Eksempel 1: super () med enkelt arv

I tilfælde af en enkelt arv tillader det os at henvise baseklassen efter 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()

Produktion

Hunden har fire ben. Hund er et varmblodet dyr.

Her kaldte vi __init__()metoden til pattedyrklassen (fra hundeklassen) ved hjælp af kode

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

i stedet for

 Pattedyr .__ init __ (selv, 'Hund')

Da vi ikke behøver at specificere navnet på baseklassen, når vi kalder dens medlemmer, kan vi nemt ændre baseklassens navn (hvis det er nødvendigt).

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

Det super()indbyggede returnerer et proxyobjekt, et erstatningsobjekt, der kan kalde metoder til baseklassen via delegering. Dette kaldes indirektion (evne til at referere til basisobjekt med super())

Da indirigering beregnes ved kørselstiden, kan vi bruge forskellige baseklasser på forskellige tidspunkter (hvis vi har brug for det).

Eksempel 2: super () med flere arv

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

Produktion

Hund har 4 ben. Hund kan ikke svømme. Hund kan ikke flyve. Hund er et varmblodet dyr. Hund er et dyr. Flagermus kan ikke svømme. Flagermus er et varmblodet dyr. Flagermus er et dyr.

Metodeopløsningsordre (MRO)

Method Resolution Order (MRO) er den rækkefølge, i hvilken metoder skal arves i nærværelse af flere arv. Du kan se MRO ved hjælp af __mro__attributten.

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

Sådan fungerer MRO:

  • En metode i de afledte opkald kaldes altid før metoden i baseklassen.
    I vores eksempel kaldes hundeklasse før NonMarineMammal eller NoneWingedMammal. Disse to klasser kaldes før pattedyr, som kaldes før dyr, og dyreklasse kaldes før objektet.
  • Hvis der er flere forældre som Dog(NonMarineMammal, NonWingedMammal), kaldes metoder til NonMarineMammal først på, fordi den vises først.

For at lære mere om super(), besøg Pythons super () betragtes som super!

Interessante artikler...