Python super ()

Iebūvētais super () atgriež starpniekservera objektu (virsklases pagaidu objektu), kas ļauj mums piekļūt bāzes klases metodēm.

Programmā Python super()ir divi galvenie lietošanas gadījumi:

  • Ļauj mums nepārprotami izmantot bāzes klases nosaukumu
  • Darbs ar vairāku mantojumu

1. piemērs: super () ar vienu mantojumu

Viena mantojuma gadījumā tas ļauj mums atsaukties uz pamatklasi 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()

Rezultāts

Suņiem ir četras kājas. Suns ir siltasiņu dzīvnieks.

Šeit mēs saucām par __init__()zīdītāju klases metodi (no Suņu klases), izmantojot kodu

 super () .__ init __ ('Suns')

tā vietā

 Zīdītājs .__ init __ (pats, 'Suns')

Tā kā mums nav jāprecizē bāzes klases nosaukums, kad zvanām uz tās dalībniekiem, mēs varam viegli mainīt bāzes klases nosaukumu (ja nepieciešams).

 # 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()Iebūvēts atgriež proxy objektu, aizvietojošu objekts, kas var zvanīt metodes bāzes klases, izmantojot deleģēšanu. To sauc par netiešo (spēju atsaukties uz bāzes objektu ar super())

Tā kā virziens tiek aprēķināts izpildlaikā, mēs varam izmantot dažādas bāzes klases dažādos laikos (ja nepieciešams).

2. piemērs: super () ar vairākkārtēju mantojumu

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

Rezultāts

Suņiem ir 4 kājas. Suns nevar peldēt. Suns nevar lidot. Suns ir siltasiņu dzīvnieks. Suns ir dzīvnieks. Sikspārnis nemāk peldēt. Sikspārnis ir siltasiņu dzīvnieks. Sikspārnis ir dzīvnieks.

Metodes izšķiršanas secība (MRO)

Metodes izšķiršanas kārtība (MRO) ir kārtība, kādā metodes jāimanto vairākkārtējas mantošanas klātbūtnē. Izmantojot __mro__atribūtu, varat skatīt MRO .

 >>> Suns .__ mro__ (,,,,,)

Lūk, kā darbojas MRO:

  • Metode atvasinātajos zvanos vienmēr tiek izsaukta pirms bāzes klases metodes.
    Mūsu piemērā suņu klase tiek saukta pirms NonMarineMammal vai NoneWingedMammal. Šīs divas klases sauc pirms zīdītāja, kas tiek saukta pirms dzīvnieka, un dzīvnieku klase tiek saukta pirms objekta.
  • Ja ir vairāki vecāki, piemēram Dog(NonMarineMammal, NonWingedMammal), vispirms tiek izmantotas NonMarineMammal metodes, jo tās parādās vispirms.

Lai uzzinātu vairāk par to super(), apmeklējiet Python super (), ko uzskata par super!

Interesanti raksti...