A super () beépített egy proxy objektumot (a szuperosztály ideiglenes objektumát) ad vissza, amely lehetővé teszi számunkra, hogy hozzáférjünk az alaposztály metódusaihoz.
A Pythonban super()
két fő felhasználási esete van:
- Lehetővé teszi, hogy kerüljük az alaposztály nevének kifejezett használatát
- Munka többszörös örökléssel
1. példa: super () egyetlen örökléssel
Egyetlen öröklés esetén lehetővé teszi számunkra az alaposztály hivatkozását 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()
Kimenet
A kutyának négy lába van. A kutya melegvérű állat.
Itt __init__()
kóddal hívtuk meg az Emlős osztály módszerét (a Kutya osztályból)
szuper () .__ init __ ('kutya')
ahelyett
Emlős .__ init __ (én, 'Kutya')
Mivel nem kell megadnunk az alaposztály nevét, amikor tagokat hívunk, könnyen megváltoztathatjuk az alaposztály nevét (ha szükséges).
# changing base class to CanidaeFamily class Dog(CanidaeFamily): def __init__(self): print('Dog has four legs.') # no need to change this super().__init__('Dog')
A super()
beépített egy proxy objektumot ad vissza, egy helyettesítő objektumot, amely az alaposztály módszereit meghívhatja delegálás útján. Ezt nevezzük indirekciónak (az alapobjektumra való hivatkozás képessége super()
)
Mivel az indirekciót futás közben számolják, különböző alaposztályokat használhatunk különböző időpontokban (ha szükséges).
2. példa: super () többszörös örökléssel
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')
Kimenet
A kutyának 4 lába van. A kutya nem tud úszni. A kutya nem tud repülni. A kutya melegvérű állat. A kutya állat. Bat nem tud úszni. Denevér melegvérű állat. Denevér állat.
Method Resolution Order (MRO)
A módszerfeloldási sorrend (MRO) az a sorrend, amelyben a módszereket többszörös öröklés jelenlétében kell örökölni. Megtekintheti az MRO-t az __mro__
attribútum használatával.
>>> Kutya .__ mro__ (,,,,,)
Így működik az MRO:
- A származtatott hívásokban egy módszert mindig az alaposztály metódusa előtt hívnak meg.
Példánkban a Dog osztályt a NonMarineMammal vagy a NoneWingedMammal elé hívják. Ezt a két osztályt hívják az emlősök elé, amelyet az Animal előtt, az Animal osztályt pedig az objektum előtt hívnak meg. - Ha több szülő
Dog(NonMarineMammal, NonWingedMammal)
van, akkor először a NonMarineMammal módszereit hívják meg, mert ezek jelennek meg először.
Ha többet szeretne megtudni super()
, látogasson el a Python szupernek () tekinthető szuper!