Python super ()

Ugrađeni super () vraća objekt proxy (privremeni objekt superklase) koji nam omogućuje pristup metodama osnovne klase.

U Pythonu postoje super()dva glavna slučaja upotrebe:

  • Omogućuje nam da izbjegavamo eksplicitno koristiti naziv osnovne klase
  • Rad s višestrukim nasljeđivanjem

Primjer 1: super () s jednim nasljeđivanjem

U slučaju pojedinačnog nasljeđivanja, omogućuje nam upućivanje osnovne klase prema 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()

Izlaz

Pas ima četiri noge. Pas je toplokrvna životinja.

Ovdje smo pozvali __init__()metodu klase Sisavci (iz klase Pas) pomoću koda

 super () .__ init __ ('Pas')

umjesto

 Sisavac .__ init __ (ja, 'pas')

Budući da ne trebamo navesti ime osnovne klase kada pozivamo njene članove, lako možemo promijeniti naziv osnovne klase (ako je potrebno).

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

super()Ugrađen vraća proxy objekt, zamjensko objekt koji se može nazvati metoda bazne klase putem delegacije. To se naziva indirektnost (sposobnost referenciranja osnovnog objekta super())

Budući da se neizravnost izračunava u vrijeme izvođenja, možemo koristiti različite osnovne klase u različito vrijeme (ako je potrebno).

Primjer 2: super () s višestrukim nasljeđivanjem

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

Izlaz

Pas ima 4 noge. Pas ne zna plivati. Pas ne može letjeti. Pas je toplokrvna životinja. Pas je životinja. Šišmiš ne zna plivati. Šišmiš je toplokrvna životinja. Šišmiš je životinja.

Nalog za rješavanje metoda (MRO)

Nalog za rješavanje metoda (MRO) je redoslijed kojim se metode trebaju nasljeđivati ​​u prisutnosti višestrukog nasljeđivanja. Pomoću __mro__atributa možete pregledati MRO .

 >>> Pas .__ mro__ (,,,,,)

Evo kako MRO radi:

  • Metoda u izvedenim pozivima uvijek se poziva prije metode osnovne klase.
    U našem se primjeru klasa Dog poziva prije NonMarineMammal ili NoneWingedMammal. Te se dvije klase pozivaju prije Sisavca, što se naziva prije Animal, a klasa Animal prije objekta.
  • Ako postoji više roditelja poput Dog(NonMarineMammal, NonWingedMammal), prvo se pozivaju metode NonMarineMammal jer se one pojavljuju prve.

Da biste saznali više o tome super(), posjetite Pythonov super () koji se smatra super!

Zanimljivi članci...