Python super ()

Vestavěné super () vrací objekt proxy (dočasný objekt nadtřídy), který nám umožňuje přístup k metodám základní třídy.

V Pythonu super()má dva hlavní případy použití:

  • Umožňuje nám vyhnout se výslovnému používání názvu základní třídy
  • Práce s více dědičnostmi

Příklad 1: super () s jednoduchou dědičností

V případě jednoduchého dědictví nám umožňuje odkazovat na základní třídu pomocí 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ýstup

Pes má čtyři nohy. Pes je teplokrevné zvíře.

Zde jsme zavolali __init__()metodu třídy Savci (ze třídy Dog) pomocí kódu

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

namísto

 Savec .__ init __ (self, 'Dog')

Jelikož při volání jejích členů nemusíme specifikovat název základní třídy, můžeme snadno změnit název základní třídy (pokud to potřebujeme).

 # 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()Vestavěný vrátí proxy objekt, předmět náhradní, které mohou volat metody základní třídy prostřednictvím delegace. Tomu se říká indirection (schopnost odkazovat na základní objekt super())

Vzhledem k tomu, že indirection je počítán za běhu, můžeme použít různé základní třídy v různých časech (pokud to potřebujeme).

Příklad 2: super () s vícenásobnou dědičností

 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ýstup

Pes má 4 nohy. Pes neumí plavat. Pes nemůže létat. Pes je teplokrevné zvíře. Pes je zvíře. Netopýr neumí plavat. Bat je teplokrevné zvíře. Netopýr je zvíře.

Order Resolution Order (MRO)

Order Resolution Order (MRO) je pořadí, ve kterém by měly být metody zděděny za přítomnosti vícenásobné dědičnosti. MRO můžete zobrazit pomocí __mro__atributu.

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

Takto funguje MRO:

  • Metoda v odvozených voláních je vždy volána před metodou základní třídy.
    V našem příkladu je třída Dog volána před NonMarineMammal nebo NoneWingedMammal. Tyto dvě třídy jsou volány před Mammal, který je volán před Animal, a Animal třída je volána před objektem.
  • Pokud existuje více rodičů Dog(NonMarineMammal, NonWingedMammal), metody NonMarineMammal jsou vyvolány jako první, protože se zobrazí jako první.

Chcete-li se dozvědět více super(), navštivte Pythonův super () považován za super!

Zajímavé články...