Utilisation de la fonction super() dans les classes Python

Principaux enseignements

  • La fonction super() de Python permet d’appeler les méthodes de la superclasse à partir d’une sous-classe, ce qui facilite la mise en œuvre de l’héritage et de la superposition de méthodes.
  • La fonction super() est étroitement liée à l’ordre de résolution des méthodes (MRO) de Python, qui détermine l’ordre dans lequel les classes ancêtres sont recherchées pour les méthodes ou les attributs.
  • L’utilisation de super() dans les constructeurs de classe est une pratique courante pour initialiser les attributs communs dans la classe mère et les attributs plus spécifiques dans la classe enfant. Ne pas utiliser super() peut avoir des conséquences inattendues, telles que des initialisations d’attributs manquantes.

L’une des principales caractéristiques de Python est son paradigme OOP, que vous pouvez utiliser pour modéliser des entités du monde réel et leurs relations.

Lorsque vous travaillez avec des classes Python, vous utilisez souvent l’héritage et remplacez les attributs ou les méthodes d’une superclasse. Python fournit un super() qui vous permet d’appeler les méthodes de la superclasse à partir de la sous-classe.

Qu’est-ce que super() et pourquoi en avez-vous besoin ?

L’héritage permet de créer une nouvelle classe Python qui hérite des caractéristiques d’une classe existante. Vous pouvez également remplacer les méthodes de la superclasse dans la sous-classe, en fournissant des implémentations alternatives. Cependant, il se peut que vous souhaitiez utiliser la nouvelle fonctionnalité en plus de l’ancienne, plutôt qu’à sa place. Dans ce cas, super() est utile.

Vous pouvez utiliser la fonction super() pour accéder aux attributs de la superclasse et invoquer les méthodes de la superclasse. La fonction super est essentielle pour la programmation orientée objet, car elle facilite la mise en œuvre de l’héritage et de la superposition de méthodes.

Comment fonctionne la fonction super() ?

En interne, super() est étroitement liée à la fonction Ordre de résolution des méthodes (MRO) en Python, que l’algorithme de linéarisation C3 détermine.

Voir aussi :  Node.js : faut-il utiliser les dépendances ou DevDependencies ?

Voici comment super() fonctionne :

  1. Déterminer la classe et l’instance actuelles: Lorsque vous appelez super() à l’intérieur d’une méthode d’une sous-classe, Python détermine automatiquement la classe courante (la classe contenant la méthode qui a appelé super()) et l’instance de cette classe (c’est-à-dire, self).
  2. Déterminer la superclasse: super() prend deux arguments – la classe actuelle et l’instance – qu’il n’est pas nécessaire de transmettre explicitement. Il utilise ces informations pour déterminer la superclasse à laquelle déléguer l’appel de méthode. Pour ce faire, il examine la hiérarchie des classes et le MRO.
  3. Invocation de la méthode dans la superclasse: Une fois la superclasse déterminée, super() vous permet d’appeler ses méthodes comme si vous les appeliez directement depuis la sous-classe. Cela vous permet d’étendre ou de remplacer des méthodes tout en utilisant l’implémentation originale de la superclasse.

Utilisation de super() dans un constructeur de classe

L’utilisation de super() dans un constructeur de classe est une pratique courante, car vous voudrez souvent initialiser des attributs communs dans la classe mère et des attributs plus spécifiques dans la classe fille.

Pour le démontrer, définissons une classe Python, Père, qui a Fils hérite :

A l’intérieur de la classe Fils l’appel à super().init() invoque le Père en lui passant le constructeur de la classe prénom et nom_de_famille comme paramètres. Cela permet de s’assurer que l’élément Père puisse toujours définir correctement les attributs de nom, même sur une classe Fils .

Si vous n’appelez pas super() dans le constructeur d’une classe, le constructeur de sa classe mère ne s’exécutera pas. Cela peut avoir des conséquences inattendues, telles que des initialisations d’attributs manquantes ou une configuration incomplète de l’état de la classe parente :

Voir aussi :  Comment utiliser la bibliothèque de composants d'éléments React Native dans votre application mobile.

Si vous essayez maintenant d’appeler le constructeur get_info la méthode soulèvera un erreur d’attribut car la méthode self.first_name et self.last_name n’ont pas été initialisés.

Utilisation de super() dans les méthodes de classe

Vous pouvez utiliser super() dans d’autres méthodes, en dehors des constructeurs, de la même manière. Cela vous permet d’étendre ou de remplacer le comportement de la méthode de la superclasse.

La méthode Son hérite de la classe Père et possède sa propre classe parler . La méthode parler de la méthode Fils utilise la méthode super().speak() pour appeler la classe parler de la méthode Père de la classe Père. Cela lui permet d’inclure le message de la classe mère tout en l’étendant avec un message spécifique à la classe enfant.

Ne pas utiliser super() dans une méthode qui en remplace une autre signifie que la fonctionnalité présente dans la méthode de la classe parente ne prendra pas effet. Il en résulte un remplacement complet du comportement de la méthode, ce qui peut conduire à un comportement que vous n’aviez pas prévu.

Comprendre l’ordre de résolution des méthodes

L’ordre de résolution des méthodes (MRO) est l’ordre dans lequel Python recherche les classes ancêtres lorsque vous accédez à une méthode ou à un attribut. MRO aide Python à déterminer quelle méthode appeler lorsqu’il existe plusieurs hiérarchies d’héritage.

Voici ce qui se passe lorsque vous créez une instance de la classe Lagos et que vous appelez la classe culture et appeler la méthode culture :

  1. Python commence par rechercher les éléments culture dans la méthode Lagos elle-même. S’il la trouve, il appelle la méthode. Sinon, il passe à la deuxième étape.
  2. S’il ne trouve pas la classe culture dans la méthode Lagos Python examine les classes de base dans l’ordre où elles apparaissent dans la définition de la classe. Dans ce cas, Lagos hérite d’abord de Afrique et ensuite de Nigeria. Python cherchera donc le culture dans Afrique d’abord.
  3. S’il ne trouve pas le culture dans la méthode Afrique Python cherchera alors dans la classe Nigeria dans la classe Nigeria Ce comportement se poursuit jusqu’à ce qu’il atteigne la fin de la hiérarchie et lance une erreur s’il ne peut trouver la méthode dans aucune des superclasses.
Voir aussi :  Comment créer un jeu de pierre, papier, ciseaux en utilisant Python

La sortie montre l’ordre de résolution des méthodes de Lagos en partant de la gauche vers la droite.

Pièges courants et bonnes pratiques

Lorsque l’on travaille avec super() mais il y a quelques pièges à éviter.

  1. Soyez attentif à l’ordre de résolution des méthodes, en particulier dans les scénarios d’héritage multiple. Si vous devez utiliser l’héritage multiple complexe, vous devez vous familiariser avec l’ordre de résolution des méthodes (Method Resolution Order). Algorithme de linéarisation C3 que Python utilise pour déterminer le MRO.
  2. Évitez les dépendances circulaires dans votre hiérarchie de classes, qui peuvent conduire à un comportement imprévisible.
  3. Documentez clairement votre code, en particulier lorsque vous utilisez super() dans des hiérarchies de classes complexes, afin de le rendre plus compréhensible pour les autres développeurs.

Utiliser super() de la bonne façon

La méthode Python super() de Python est une fonction puissante lorsque vous travaillez avec l’héritage et la superposition de méthodes. Comprendre comment la fonction super() et suivre les meilleures pratiques vous permettra de créer un code plus facile à maintenir et plus efficace dans vos projets Python.

Améliorez votre QI technologique grâce à nos lettres d’information gratuites

En vous abonnant, vous acceptez notre politique de confidentialité et pouvez recevoir des communications occasionnelles ; vous pouvez vous désabonner à tout moment.

Cliquez pour évaluer cet article !
[Total: Moyenne : ]

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *