Outils pour utilisateurs

Outils du site


cours:informatique:fun_mooc:python3_uca_inria:620_methode_speciale

Ceci est une ancienne révision du document !


Python: les méthodes spéciales

Nous avons vu précédemment que nous pouvions définir des méthodes sur les classes. C'est quelque chose de tout à fait classique, les classes définissent en général un certain nombre de méthodes que l'on utilise pour manipuler les attributs des instances. Cependant, nous avons également expliqué que, en Python, une caractéristique des classes, c'est qu'on peut créer nos objets qui se manipulent exactement comme des types built-in.

Vous pouvez tout à fait créer une classe `Phrase` que vous allez initialiser comme vous initialiseriez, par exemple, une liste, directement à la construction de l'instance.

  • Vous pourriez également obtenir le nombre de mots directement avec la fonction *built-in* len();
  • Faire un test d'appartenance directement avec l'instruction in;
  • Accéder par exemple au troisième mot avec la notation crochets comme on le ferait avec une liste;
  • Faire un print() directement sur votre instance pour afficher par exemple la liste des mots affichés en colonne;
  • Ou encore, si vous avez deux objets `Phrase`, pouvoir les concaténer simplement avec l'opérateur '+'.

Toutes ces opérations peuvent être implémentées sur votre propre classe 'Phrase'. La manière d'implémenter cela en Python est par l'intermédiaire de ce que l'on appelle des méthodes spéciales.

Les méthodes spéciales commencent toutes par un double underscore et finissent toutes par un double underscore, et sont appelées automatiquement lorsque l'on utilise par exemple une fonction *built-in*, un opérateur comme une addition ou alors une instruction comme le test d'appartenance avec in. Notamment, le test d'appartenance correspond à la méthode qui s'écrit __contains__().

Le premier comportement que l'on implémente pour toutes les classes est l'initialisation de l'instance. I est naturel lorsque l'on crée une instance, que l' instance puisse être initialisée avec un certain nombre d'attributs déjà prédéfinis. Donc la manière de le faire, en Python, c'est de définir une méthode spéciale qui s'appelle __init__().

Cet initialisateur, qu'on appelle parfois par abus de langage un constructeur mais qui n'est pas vraiment un constructeur, qui est juste quelque chose qui initialise mon instance une fois qu'elle a été créée, me permet de créer des attributs automatiquement avec une certaine valeur par défaut lorsque je crée mon instance. Donc ça, c'est le premier comportement que j'ai implémenté avec cette méthode spéciale __init__().

Si on souhaite obtenir le nombre de mots avec la fonction built-in len() exactement comme on le ferait avec un type built-in, on peut implémenter une méthode spéciale qui va s'appeler __len__(). Cette méthode `len()` doit retourner un entier qui va correspondre à la taille de l'objet (pour notre exemple Phrase, le nombre de mots qu'elle contient).

Un autre comportement classique que l'on pourrait vouloir implémenter, c'est par exemple le test d'appartenance. Ça serait extrêmement pratique de pouvoir déterminer, par exemple, si le mot 'mooc' est dans l' instance? Là encore, on s'appuie sur une méthode spéciale dédiée qui s'appelle __contains__(). On définit __contains__() qui prend comme premier argument “self”, toujours mon instance, et comme deuxième argument le mot sur lequel je veux faire le test. Cette méthode doit retourner un booléen qui vaut Vrai si mot est dans l'instance, ou Faux sinon.

Une dernière méthode très courante, qu'on implémente très souvent pour les classes, c'est la méthode qui permet de supporter la fonction *built-in* print(). Par défaut si on appelle print() avec l'instance en argument on voit s'afficher l'adresse de l'objet, ce qui a assez peu d'intérêt. Or, si on veut avoir une manière d'afficher ce que contient l' instance, qui peut être utile en cours d'exécution du programme mais également si on veut débugger le programme, on doit implémenter une méthode qui s'appelle __str__() qui doit retourner une chaîne de caractères.

Nous venons de détailler quelques méthodes spéciales usuelles et nous avons vu que ces méthodes spéciales permettent de créer vos propres classes qui se comportent comme des types *built-in*. C'est donc extrêmement souple, extrêmement puissant. Nous n' avons abordé ici qu'un petit sous-ensemble des méthodes spéciales mais il existe autour d'une centaine de méthodes spéciales. Il faut savoir également que ces méthodes spéciales peuvent constituer ce que l'on appelle un protocole, notamment le protocole d'itération, ou le protocole de context manager que nous aborderons prochainement.

cours/informatique/fun_mooc/python3_uca_inria/620_methode_speciale.1622297872.txt.gz · Dernière modification : 2021/05/29 14:17 de 77.192.232.26