Python super ()

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!

érdekes cikkek...