Python super ()

Super () innebygd returnerer et proxy-objekt (midlertidig objekt i superklassen) som lar oss få tilgang til metoder i baseklassen.

I Python super()har to store bruksområder:

  • Tillater oss å unngå å bruke baseklassenavnet eksplisitt
  • Arbeide med flere arv

Eksempel 1: super () med Single Arv

Når det gjelder enkeltarv, tillater det oss å referere basisklassen etter 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()

Produksjon

Hunden har fire ben. Hund er et varmblodet dyr.

Her kalte vi __init__()metoden til pattedyrklassen (fra hundeklassen) ved hjelp av kode

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

i stedet for

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

Siden vi ikke trenger å spesifisere navnet på baseklassen når vi ringer til medlemmene, kan vi enkelt endre baseklassenavnet (hvis vi trenger det).

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

Den super()innebygde returnerer et proxy-objekt, et erstatningsobjekt som kan kalle metoder for baseklassen via delegering. Dette kalles indireksjon (evne til å referere til basisobjekt med super())

Siden indireksjonen blir beregnet på kjøretiden, kan vi bruke forskjellige baseklasser til forskjellige tidspunkter (hvis vi trenger 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')

Produksjon

Hunden har 4 ben. Hunden kan ikke svømme. Hund kan ikke fly. Hund er et varmblodet dyr. Hund er et dyr. Flaggermus kan ikke svømme. Flaggermus er et varmblodet dyr. Flaggermus er et dyr.

Metodeoppløsningsordre (MRO)

Method Resolution Order (MRO) er rekkefølgen metodene skal arves i nærvær av flere arv. Du kan se MRO ved hjelp av __mro__attributtet.

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

Slik fungerer MRO:

  • En metode i de avledede samtalene kalles alltid før metoden til baseklassen.
    I vårt eksempel kalles hundeklasse før NonMarineMammal eller NoneWingedMammal. Disse to klassene kalles før pattedyr, som kalles før dyr, og dyreklasse kalles før objektet.
  • Hvis det er flere foreldre som Dog(NonMarineMammal, NonWingedMammal), blir metoder for NonMarineMammal påkalt først fordi det vises først.

For å lære mer om super(), besøk Pythons super () ansett som super!

Interessante artikler...