Sisseehitatud super () tagastab proksiobjekti (ülemklassi ajutine objekt), mis võimaldab meil pääseda juurde baasklassi meetoditele.
Pythonis super()
on kaks peamist kasutusjuhtumit:
- Võimaldab meil vältida baasklassi nime selgesõnalist kasutamist
- Töötamine mitme pärandiga
Näide 1: super () ühe pärandiga
Ühekordse pärimise korral võimaldab see meil viidata baasklassile 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äljund
Koeral on neli jalga. Koer on soojavereline loom.
Siinkohal nimetasime __init__()
koodi Imetajate klassi (koerte klassist) meetodit
super () .__ init __ ('koer')
selle asemel
Imetaja .__ init __ (ise, koer)
Kuna me ei pea selle liikmetele helistades määrama baasklassi nime, saame baasklassi nime hõlpsasti muuta (kui vaja).
# 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 tagastab proxy objekti, asenda objekti, mida saab helistada meetodeid baasklass delegeerimise kaudu. Seda nimetatakse indirectioniks (võime alusobjektile viidata super()
)
Kuna indirection arvutatakse tööajal, saame kasutada erinevaid baasklasse erinevatel aegadel (kui vaja).
Näide 2: super () mitme pärandiga
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äljund
Koeral on 4 jalga. Koer ei oska ujuda. Koer ei saa lennata. Koer on soojavereline loom. Koer on loom. Nahkhiir ei oska ujuda. Nahkhiir on soojavereline loom. Nahkhiir on loom.
Meetodi lahendamise järjekord (MRO)
Method Resolution Order (MRO) on järjekord, milles meetodid tuleks pärida mitmekordse pärimise korral. __mro__
Atribuudi abil saate MRO-d vaadata .
>>> Koer .__ mro__ (,,,,,)
MRO töötab nii:
- Tuletatud kõnede meetodit kutsutakse alati enne baasklassi meetodit.
Meie näites nimetatakse koeraklassi enne NonMarineMammal või NoneWingedMammal. Neid kahte klassi nimetatakse enne imetajat, mida nimetatakse enne looma, ja looma klassi nimetatakse objekti ees. - Kui sarnaseid vanemaid on mitu
Dog(NonMarineMammal, NonWingedMammal)
, kasutatakse kõigepealt NonMarineMammali meetodeid, kuna see ilmub esimesena.
Lisateabe saamiseks super()
külastage Pythoni superi (), mida peetakse super!