„Python super“ ()

„Super“ („builtin“) grąžina tarpinį objektą (laikiną viršutinės klasės objektą), kuris leidžia mums pasiekti pagrindinės klasės metodus.

„Python“ super()turi du pagrindinius naudojimo atvejus:

  • Leidžia mums vengti aiškiai naudoti bazinės klasės pavadinimą
  • Darbas su daugkartiniu paveldėjimu

1 pavyzdys: super () su vienu paveldėjimu

Vieno paveldėjimo atveju tai leidžia mums nurodyti pagrindinę klasę 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()

Rezultatas

Šuo turi keturias kojas. Šuo yra šiltakraujis gyvūnas.

Čia mes pavadinome __init__()Žinduolių klasės metodą (iš Šuns klasės) naudodami kodą

 super () .__ init __ ('Šuo')

vietoj

 Žinduolis .__ init __ (pats, „Šuo“)

Kadangi mums nereikia nurodyti pagrindinės klasės pavadinimo, kai skambiname jos nariams, galime lengvai pakeisti bazinės klasės pavadinimą (jei to reikia).

 # 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()BUILTIN grįžta proxy objektas, pakaitalas objektą, galite skambinti metodus bazinės klasės per delegacija. Tai vadinama netiesiogine (galimybė nurodyti bazinį objektą super())

Kadangi kryptis apskaičiuojama vykdymo metu, galime naudoti skirtingas bazines klases skirtingu laiku (jei to reikia).

2 pavyzdys: super () su daugybiniu paveldėjimu

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

Rezultatas

Šuo turi 4 kojas. Šuo nemoka plaukti. Šuo negali skristi. Šuo yra šiltakraujis gyvūnas. Šuo yra gyvūnas. Šikšnosparnis nemoka plaukti. Šikšnosparnis yra šiltakraujis gyvūnas. Šikšnosparnis yra gyvūnas.

Metodo sprendimo tvarka (MRO)

Metodo sprendimo tvarka (MRO) yra tvarka, kuria metodai turėtų būti paveldimi esant daugybiniam paveldėjimui. MRO galite peržiūrėti naudodami __mro__atributą.

 >>> Šuo .__ mro__ (,,,,,)

Štai kaip veikia MRO:

  • Išvestinių skambučių metodas visada vadinamas prieš pagrindinės klasės metodą.
    Mūsų pavyzdyje šuns klasė vadinama prieš NonMarineMammal arba NoneWingedMammal. Šios dvi klasės vadinamos prieš žinduolį, kuris vadinamas prieš gyvūną, o gyvūnų klasė - prieš objektą.
  • Jei yra keli panašūs tėvai Dog(NonMarineMammal, NonWingedMammal), pirmiausia pasitelkiami „NonMarineMammal“ metodai, nes jie rodomi pirmiausia.

Norėdami sužinoti daugiau apie tai super(), apsilankykite „Python“ super () laikomame super!

Įdomios straipsniai...