POO en Python | Décorateurs (Propriété) | Getter, Setter et Deleter

Python POO

Dans ce tuto, nous allons en savoir plus sur les méthodes Getter, Setter et Deleter et comment les utiliser.

Djibril Dassebe https://example.com/norajones
2022-10-30

Étude de cas

Dans cet exemple, nous avons une classe appelée Person ayant quatre variables: prénom, nom, adresse et email, que nous obtenons à l’aide du prénom et du nom. Nous avons une méthode appelée fullname comme nom complet que nous obtenons à l’aide du prénom et du nom. Créons un objet per = Person('Sam', 'Edison', 'India') pour que nous puissions comprendre ce qui se passe.

Ici self sera mon objet -> per, first -> Sam, last -> Edison et add -> India. Essayons d’afficher per.fullname() et per.email

J’imprime la variable à l’aide de objet per son prénom Sam concaténé avec un point et le nom de famille qui est Edison et puis concaténé avec @gmail.com. Maintenant si je veux changer le prénom, avec Samuel par exemple, Observons ce qui se passe

Nous constatons que l’adresse mail est toujours la même et nous allons comprendre pourquoi. Quand je crée un objet il sera stocké avec certaines variables qui sont initialement à l’intérieur l’objet (dans notre cas first= Sam, last= Edison, add= India). Au moment où Je crée un objet ma méthode init va être appelée avec les 4 variables qu’elle a initialement. Donc, lorsque nous appelons print(per.fullname()) et print(per.email) après avoir défini l’objet per, ce sont toujours ces valeurs initiales que nous avons.

Tous les attributs dans le constructeur init sont appelés seulement une seule fois et per.first = 'Samuel' initialise la variable first-> Samuel. Rien ne se passe dans email qui est à l’intérieur de mon constructeur init qui a justement déjà été appelé avec le prénom Sam. Quand nous appelons print(per.fullname()) par la suite, la méthode fullname() prendra en compte le nouveau prénom qui est Samuel pris dans la méthode fullname() de self.first==> Samuel.

Par contre, quand print(per.email) est appelé pour la deuxième fois il n y a pas de changement parce que l’adresse email est récupérée a l’intérieur de la méthode init qui ne sera appelée qu’une seule fois. Que devons-nous faire?

Donc au lieu de le mettre à l’intérieur de la méthode init nous pouvons créer une autre méthode appelée email, et le problème sera résolu

Remarque

Dans init email était un attribut que nous avons appelé plus haut, variable et maintenant email est une méthode c’est la raison pour laquelle lorsque nous affichons nous avons en sortie les références de la méthode. Nous avons juste à l’appeler comme une méthode en ajoutant les parenthèses () à la fin

La méthode Getter

Mais si nous voulons avoir accès à email même si c’est une méthode, nous ne sommes pas obligés de l’appeler comme une méthode mais plutôt comme une variable dans ce cas, que devons-nous faire ? Nous devons utiliser un décorateur @property. Nous utiliserons le décorateur si nous ne voulons pas changer la fonctionnalité d’une fonction (méthode). Nous avons donc

Nous pouvons donc faire la même chose avec la méthode fullname() et la méthode name_and_Country() que j’ai ajoutée et nous obtenons

On appelle egalement ce processus Getter.

La méthode Setter

Jusqu’ici nous avons changé le prénom uniquement. Et si on changeait le nom complet ?

Actuellement fullname est une méthode et non un attribut. Si nous essayons d’assigner quelque chose à une méthode ça nous dira en erreur que fullname n’est pas attribut car nous ne pouvons assigner une valeur qu’ à un attribut et non à une méthode.

Ceci est possible mais pour cela nous allons utiliser une méthode appelée Setter en écrivant @fullname.setter

Deleter

Et si je veux effacer le nom complet ? effacer un Object et un attribut est possible mais si nous essayons d’effacer une méthode, nous aurons un message d’erreur

Ceci est possible mais nous allons utiliser un décorateur, une méthode appelée Deleter en écrivant @fullname.deleter

Pour vérification, si nous essayons d’afficher le prénom et le nom, nous avons

Et bien, nous avons des idées plus claires par rapport aux méthodes Getter, Setter et deleter.

C’était tout pour ce tutoriel

Merci pour la lecture