Python super ()

Vgrajeni super () vrne objekt proxy (začasni objekt superklase), ki nam omogoča dostop do metod osnovnega razreda.

V Pythonu super()ima dva glavna primera uporabe:

  • Omogoča, da se izognemo izrecni uporabi imena osnovnega razreda
  • Delo z večkratno dediščino

Primer 1: super () z eno dediščino

V primeru enkratnega dedovanja nam omogoča, da osnovni razred napotimo po 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()

Izhod

Pes ima štiri noge. Pes je toplokrvna žival.

Tu smo __init__()s kodo poklicali metodo razreda Sesalci (iz razreda Dog)

 super () .__ init __ ('Pes')

namesto

 Sesalci .__ init __ (jaz, 'pes')

Ker nam ni treba določiti imena osnovnega razreda, ko pokličemo njegove člane, lahko enostavno spremenimo ime osnovnega razreda (če je treba).

 # 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()Vgrajeno vrne proxy objekta, nadomestni objekt, ki lahko pokličete metode osnovnega razreda z delegacijo. To se imenuje indirektnost (sposobnost sklicevanja na osnovni objekt super())

Ker se indirektnost izračuna med izvajanjem, lahko ob različnih časih uporabimo različne osnovne razrede (če je treba).

Primer 2: super () z večkratnim dedovanjem

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

Izhod

Pes ima 4 noge. Pes ne zna plavati. Pes ne more leteti. Pes je toplokrvna žival. Pes je žival. Netopir ne zna plavati. Netopir je toplokrvna žival. Netopir je žival.

Nalog za reševanje metode (MRO)

Nalog za reševanje metode (MRO) je vrstni red, v katerem je treba metode podedovati ob večkratnem dedovanju. Z uporabo __mro__atributa si lahko ogledate MRO .

 >>> Pes .__ mro__ (,,,,,)

Tako deluje MRO:

  • Metoda v izvedenih klicih se vedno pokliče pred metodo osnovnega razreda.
    V našem primeru je dog razred poklican pred NonMarineMammal ali NoneWingedMammal. Ta dva razreda se pokličeta pred Sesalcem, ki se pokliče pred Animal, in razred Animal se pokliče pred objektom.
  • Če je več staršev všeč Dog(NonMarineMammal, NonWingedMammal), se najprej pokličejo metode NonMarineMammal, ker se najprej prikaže.

Če želite izvedeti več o tem super(), obiščite Pythonov super (), ki velja za super!

Zanimive Članki...