Translate

vendredi 26 janvier 2018

[ PYTHON ] - Les Méthodes magiques

Cet article est tiré d'un chapitre de mon livre présenté plus bas

Les Méthodes magiques en Python se sont les méthodes qui commencent et finissent avec un double underscore et elles nous permettent en quelques sortes de reprogrammer le fonctionnement d'une opération
Les plus communes : __init__ : Le constructeur d’une classe, qui permet d’y créer ses attributs.



Je le crée sur la capture suivante :



__str__ : Cette méthode renverra le résultat quand vous casterez votre objet en String ou que vous l’afficherez dans un print.



Quand vous affichez l’objet dans un print cela donne le résultat de la capture suivante :



__repr__ : Cette méthode formaterra l’objet quand vous l’afficherez (utilisé pour le débugage. Si vous affichez l’objet dans un print et qu’il a déjà une méthode __str__ définie c’est cette dernière qui s’affichera.



Quand je l’affiche (capture suivante) :



Vous savez que quand vous additionnez deux nombres avec le signe + en Python ça vous donne la somme des deux nombres. Vous savez aussi que ce même signe + pour des chaines de caractères, ça les concatène. Mais savez vous que vous pouvez programmer le comportement de ce signe + quand il est utilisé sur les objets des classes que vous créez ? Ceci marche aussi pour les autres signes : -, *, /, % etc…

__add__ : Commençons par la méthode magique __add__ qui gère l’addition. Dans l’exemple que va suivre, au lieu de créer quelque chose de banal je vais créer quelque chose qui va vous montrer toute la puissance des méthodes magiques en Python. Imaginez notre classe Personne crééé plus haut, nous allons implémenter la méthode __add__ pour additionner deux personnes. Je vais avoir besoin de gérer le genre de la personne H ou F et de créer une sous classe Bébé qui dira que si les deux personnes que l’on additionne sont de genre different alors la méthode retourne un bébé. Je vais aussi gérer le fait que le nom de famille de la femme devienne le même que celui de l’homme. Regardons le code :



J’importe random pour pouvoir gérer aléatoirement le sexe du bébé. Dans la classe Personne j’ai rajouté le genre. Ce qui nous intéresse ici commence à la ligne 24, avec la méthode magique __add__, qui prend comme argument : other (forcement quand on additione on a besoin d’une deuxième valeur). A la ligne 25 c’est juste un print que j’ai mis pour plus de précision. Ligne 26 je dis que si le genre de l’objet courant est different du genre avec lequel on fait l’addition alors on continue l’exécution du code (je n’ai pas ajouté de code au cas ou les personnes seraient du même sexe, mais libre à vous de le faire, vous n’avez qu’à créer la méthode adoption et optimiser le code). Ligne 27 je crée le prenom du bébé en lui donnant le nom de la personne courante et en rajoutant junior à la fin. Notez que j’aurais du m’assurer que c’était bien le prénom du père que je donnais avant de faire ça mais vu que ça n’est pas du tout le sujet de ce chapitre je ne m’attarde pas dessus. Ligne 29 je dis que si le genre de la personne courante est féminin alors elle prendra le nom de famille de l’autre, autrement c’est l’autre qui prendra son nom de famille. Ligne 34, je retourne un objet de la classe Bebe que l’on va créer plus bas. En lui donnant son prénom et le nom du couple. Ligne 36 c’est juste la méthode magique __repr__ (voir plus haut). Suite du code :



Voici la classe Bebe qui hérite de la classe Personne. Je ne m’attarde pas dessus ça n’est pas du tout le sujet de ce chapitre. Suite du code :



Ici je crée deux personnes de ma classe Personne : Julien Faujanet, Homme et Emilie Martin, Femme. Je les affiche d’abord dans un print, puis ligne 68, j’additionne enfin personne01 et personne02 et je renvoie le retour dans la variable bebe. Ligne 70 je refais un print sur personne02 (la femme), pour vous montrer que son nom de famille a changé, et ligne 71 j’affiche bébé. Notez que j’ai sauté la partie sur la génération aléatoire du sexe du bébé, comme je vous l’ai dit plus haut, mais c’est dans la classe Bebe que ça se joue. Résultat :



Voilà, la personne02 porte à présent mon nom de famille et vu que son papa est un « programmeur fénéant » (pléonasme ?), mon bébé est une fille avec un prénom de garçon.

__sub__ :
La méthode __sub__ marche exactement de la même manière que __add__ mais pour la soustraction.

__mul__ :
La méthode __mul__ a le même principe mais pour la multiplication.

__div__ :
La méthode __div__ est pour la division.

__pow__ :
La méthode __pow__ est pour les puissances.

Il y a aussi les méthodes : (je retire leur double underscore pour les mentionner ici ):
lshift, rshift, and, or, xor, mais pour les comprendre il faut avoir lu le chapitre suivant donc je n’en parlerai pas ici mais elles vous semblerons plus claires (et intéressantes) plus tard.
Il y a aussi les méthodes pour les comparaisons qui correspondent aux signes : >, <, >=, <=, ==, != :

lt : plus petite que,
le : plus petit ou égal,
eq : égal,
ne : different de,
gt : plus grand que,
ge : plus grand ou égal,


il y a les méthodes neg, pos, qui sont implémentées pour gérer les signes – ou + devant l’objet. Vous pouvez vous en servir par exemple pour dire que si l’objet personne a le signe moins devant (ça devient un bébé) ou que si sur une classe couleur que vous créez votre objet qui correspond à la couleur rouge a le signe moins devant elle devient du cyan. Bref à vous de voir.

Il y a aussi abs, qui retourne la valeur absolue et : invert, vous pouvez vous servir de cette dernière par exemple pour dire que si le signe ~tilde (qui appelera invert) est utilisé sur la classe personne, si son genre est homme, ça devient une femme et inversement. Ou pour d’autres utilisations encore.

Plus surprenant il y a la méthode __round__ qui vous permet de gérer comment arrondir votre objet quand vous l’enverrez à la fonction native round() que l’on a vu plus haut. Regardez sur ma classe Personne de tout à l’heure :



Désolé pour mes captures, derrière la souris il est marqué –n comme le premier. On l’utilise comme ceci :



Je demande ici d’arrondir à 3 ce qui dans ma classe correspond jusqu’au 3ème caractère en partant de la fin. Résultat :



Voilà, je peux choisir n’importe quelle façon de le gérer, en demandant de ne m’afficher que les initiales ou autre. Et pour finir dans cette section vous avez aussi int, float et complex, pour gérer comment afficher vos objets quand vous les castez dans ces types là.

Cet article vous a plu ? Partagez-le !!!!!!!

Cet article est tiré de ce livre :

Aucun commentaire:

Enregistrer un commentaire