Python super ()

Sisäänrakennettu super () palauttaa välityspalvelinobjektin (yliluokan väliaikainen objekti), jonka avulla voimme käyttää perusluokan menetelmiä.

Pythonissa super()on kaksi pääkäyttötapaa:

  • Sen avulla voimme välttää perusluokan nimen nimenomaista käyttöä
  • Useiden perintöjen käyttäminen

Esimerkki 1: super () yhdellä perinnöllä

Yhden perinnön tapauksessa se antaa meille mahdollisuuden viitata perusluokkaan 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()

Tuotos

Koiralla on neljä jalkaa. Koira on lämminverinen eläin.

Tässä kutsuttiin __init__()nisäkäsluokan menetelmää (Koiraluokasta) koodilla

 super () .__ init __ ('Koira')

sijasta

 Nisäkäs .__ init __ (itse, 'Koira')

Koska meidän ei tarvitse määrittää perusluokan nimeä kutsuttaessa sen jäseniä, voimme helposti muuttaa perusluokan nimen (jos tarvitsemme).

 # 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()Sisäänrakennettu palauttaa proxy esine, korvaava esine, joka voi soittaa menetelmiä perustaa luokan kautta valtuuskunta. Tätä kutsutaan indirectioniksi (kyky viitata perusobjektiin super())

Koska suuntaus lasketaan ajon aikana, voimme käyttää erilaisia ​​perusluokkia eri aikoina (jos tarvitsemme).

Esimerkki 2: super () moninkertaisella perinnöllä

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

Tuotos

Koiralla on 4 jalkaa. Koira ei osaa uida. Koira ei voi lentää. Koira on lämminverinen eläin. Koira on eläin. Lepakko ei osaa uida. Lepakko on lämminverinen eläin. Lepakko on eläin.

Menetelmän tarkkuusjärjestys (MRO)

Method Resolution Order (MRO) on järjestys, jossa menetelmät tulisi periä useiden perintöjen läsnä ollessa. Voit tarkastella MRO: ta käyttämällä __mro__attribuuttia.

 >>> Koira .__ mro__ (,,,,,)

Näin MRO toimii:

  • Johdettujen puheluiden menetelmää kutsutaan aina ennen perusluokan menetelmää.
    Esimerkissämme koiraluokkaa kutsutaan ennen NonMarineMammal tai NoneWingedMammal. Näitä kahta luokkaa kutsutaan ennen nisäkästä, jota kutsutaan ennen eläintä, ja eläinluokkaa kutsutaan ennen kohdetta.
  • Jos on useita vanhempia, kuten Dog(NonMarineMammal, NonWingedMammal)NonMarineMammal-menetelmät, käytetään ensin, koska se näkyy ensin.

Saat lisätietoja super()käymällä Pythonin super () -sivustossa, jota pidetään super!

Mielenkiintoisia artikkeleita...