Python super ()

La fonction intégrée super () renvoie un objet proxy (objet temporaire de la superclasse) qui nous permet d'accéder aux méthodes de la classe de base.

En Python, super()a deux cas d'utilisation majeurs:

  • Nous permet d'éviter d'utiliser explicitement le nom de la classe de base
  • Utilisation de l'héritage multiple

Exemple 1: super () avec héritage unique

Dans le cas d'un héritage unique, cela nous permet de référencer la classe de base par 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()

Production

Le chien a quatre pattes. Le chien est un animal à sang chaud.

Ici, nous avons appelé la __init__()méthode de la classe Mammal (de la classe Dog) en utilisant du code

 super () .__ init __ ('Chien')

au lieu de

 Mammifère .__ init __ (soi-même, 'Chien')

Comme nous n'avons pas besoin de spécifier le nom de la classe de base lorsque nous appelons ses membres, nous pouvons facilement changer le nom de la classe de base (si nécessaire).

 # changing base class to CanidaeFamily class Dog(CanidaeFamily): def __init__(self): print('Dog has four legs.') # no need to change this super().__init__('Dog')

L' super()intégré renvoie un objet proxy, un objet de substitution qui peut appeler des méthodes de la classe de base via la délégation. C'est ce qu'on appelle l'indirection (possibilité de référencer l'objet de base avec super())

Puisque l'indirection est calculée au moment de l'exécution, nous pouvons utiliser différentes classes de base à des moments différents (si nécessaire).

Exemple 2: super () avec héritage multiple

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

Production

Le chien a 4 pattes. Le chien ne sait pas nager. Le chien ne peut pas voler. Le chien est un animal à sang chaud. Le chien est un animal. La chauve-souris ne sait pas nager. La chauve-souris est un animal à sang chaud. La chauve-souris est un animal.

Ordre de résolution de méthode (MRO)

L'ordre de résolution des méthodes (MRO) est l'ordre dans lequel les méthodes doivent être héritées en présence d'héritage multiple. Vous pouvez afficher le MRO à l'aide de l' __mro__attribut.

 >>> Chien .__ mro__ (,,,,,)

Voici comment fonctionne MRO:

  • Une méthode dans les appels dérivés est toujours appelée avant la méthode de la classe de base.
    Dans notre exemple, la classe Dog est appelée avant NonMarineMammal ou NoneWingedMammal. Ces deux classes sont appelées avant Mammal, qui est appelée avant Animal, et la classe Animal est appelée avant l'objet.
  • S'il existe plusieurs parents comme Dog(NonMarineMammal, NonWingedMammal), les méthodes de NonMarineMammal sont appelées en premier car elles apparaissent en premier.

Pour en savoir plus super(), visitez super () de Python considéré comme super!

Articles intéressants...