Python super ()

Integrované super () vracia objekt proxy (dočasný objekt nadtriedy), ktorý nám umožňuje prístup k metódam základnej triedy.

V Pythone super()má dva hlavné prípady použitia:

  • Umožňuje nám vyhnúť sa výslovnému použitiu názvu základnej triedy
  • Práca s viacnásobným dedičstvom

Príklad 1: super () s jednoduchou dedičnosťou

V prípade jednoduchého dedičstva nám umožňuje odkázať na základnú triedu o 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()

Výkon

Pes má štyri nohy. Pes je teplokrvné zviera.

Tu sme __init__()pomocou kódu nazvali metódu triedy Cicavce (zo triedy Dog)

 super () .__ init __ („Pes“)

namiesto

 Cicavec .__ init __ (ja, „pes“)

Pretože pri volaní jej členov nemusíme špecifikovať názov základnej triedy, môžeme názov základnej triedy ľahko zmeniť (ak je to potrebné).

 # 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()Vstavaný vráti proxy objekt, predmet náhradné, ktoré môžu volať metódy základnej triedy prostredníctvom delegácie. Toto sa nazýva indirection (schopnosť odkazovať na základný objekt super())

Pretože sa indirection počíta za behu programu, môžeme v prípade potreby použiť rôzne základné triedy v rôznom čase (ak je to potrebné).

Príklad 2: super () s viacnásobnou dedičnosťou

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

Výkon

Pes má 4 nohy. Pes nevie plávať. Pes nevie lietať. Pes je teplokrvné zviera. Pes je zviera. Netopier nevie plávať. Netopier je teplokrvné zviera. Netopier je zviera.

Order Resolution Order (MRO)

Poradie rozlíšenia metód (MRO) je poradie, v ktorom by sa metódy mali dediť za prítomnosti viacnásobného dedičstva. MRO môžete zobraziť pomocou __mro__atribútu.

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

Takto funguje MRO:

  • Metóda v odvodených volaniach sa volá vždy pred metódou základnej triedy.
    V našom príklade sa trieda Dog volá pred NonMarineMammal alebo NoneWingedMammal. Tieto dve triedy sa volajú skôr Cicavec, ktorý sa volá skôr ako Zviera, a Trieda Zviera sa volá pred objektom.
  • Ak existuje viac podobných rodičov Dog(NonMarineMammal, NonWingedMammal), metódy NonMarineMammal sa vyvolajú ako prvé, pretože sa zobrazia ako prvé.

Ak sa chcete dozvedieť viac super(), navštívte stránku Python's super () považovanú za super!

Zaujímavé články...