Python super ()

Super () -inbyggnaden returnerar ett proxyobjekt (tillfälligt objekt i superklassen) som låter oss komma åt metoder för basklassen.

I Python super()har två huvudsakliga användningsfall:

  • Tillåter oss att undvika att använda basklassnamnet uttryckligen
  • Arbeta med flera arv

Exempel 1: super () med Single Arv

I fallet med enstaka arv tillåter det oss att referera basklassen efter 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()

Produktion

Hunden har fyra ben. Hund är ett varmblodigt djur.

Här kallade vi __init__()metoden för däggdjursklassen (från hundklassen) med hjälp av kod

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

istället för

 Däggdjur .__ init __ (själv, 'Hund')

Eftersom vi inte behöver ange basklassens namn när vi ringer till medlemmarna kan vi enkelt ändra basklassnamnet (om vi behöver).

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

Det super()inbyggda returnerar ett proxyobjekt, ett ersättningsobjekt som kan anropa basklassens metoder via delegering. Detta kallas indirektion (förmåga att referera till basobjekt med super())

Eftersom indirection beräknas vid körning kan vi använda olika basklasser vid olika tidpunkter (om vi behöver).

Exempel 2: super () med multipel 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')

Produktion

Hunden har 4 ben. Hunden kan inte simma. Hund kan inte flyga. Hund är ett varmblodigt djur. Hund är ett djur. Fladdermusen kan inte simma. Fladdermus är ett varmblodigt djur. Fladdermus är ett djur.

Metodupplösningsorder (MRO)

Method Resolution Order (MRO) är den ordning i vilken metoder ska ärvas i närvaro av flera arv. Du kan visa MRO med __mro__attributet.

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

Så här fungerar MRO:

  • En metod i de härledda samtalen kallas alltid före basklassens metod.
    I vårt exempel kallas hundklass före NonMarineMammal eller NoneWingedMammal. Dessa två klasser kallas före däggdjur, som kallas före djur, och djurklass kallas före objektet.
  • Om det finns flera föräldrar Dog(NonMarineMammal, NonWingedMammal), åberopas metoder för NonMarineMammal först eftersom det visas först.

För att lära dig mer om super(), besök Pythons super () anses vara super!

Intressanta artiklar...