Python -Utiliser les getters et setters en python
13 sept. 2022
Contrairement à d'autres langages, l'utilisation d'un getter ou setter en python est peu trouvé, car il est jugé non pythonique. Nous allons voir ce que préconise python pour mettre en place cet accès au propriété d'un objet
Le setter sera un décorateur à apposer au-dessus de la méthode mettant à jour la propriété. Le nom du décorateur varie en fonction du nom de la méthode du getter. Ici on retrouvera birth_date après l'arobase pour le setter car c'est le nom de la méthode getter. On suivra ce nom par un point et le mot setter
Vous avez vu que l'accès à la propriété year ne contient pas de parenthèse (alors que l'on a défini une méthode), c'est le décorateur qui fait le lien automatiquement.
De cette manière nous protégeons également la propriété privée
Pour rappel, une propriété privée porte un double underscore devant son nom mais il s'agit bien d'une convention.
Ainsi on peut assez facilement accéder à cette propriété depuis
Vous allez me dire que l'on aurait très bien pu se passer de ces 2 méthodes et mettre en place la manipulation directe de l'attribut birth_date (cette fois sans le dunder).
Mais il peut être intéressant de passer par des méthodes lorsque l'on a besoin de faire des transformations. Ici nous allons calculer son âge à partir de sa date de naissance
Vous avez remarqué que le setter sur year ne fonctionne pas, car nous n'avons pas mis en place le décorateur @year.setter
De cette façon on se protège de la mise à jour de propriété
Cette méthode comprise dans la librairie standard permet d'être exécuté lorsque le code met à jour une propriété. A l'intérieur de cette méthode on peut définir nos règles
Ici on retrouve une classe plus légère mais moins lisible.
L'usage de setattr peut être intéressante quand vous avez besoin d'initialiser plusieurs propriétés
Dans l'exemple ci-dessus nous utilisons la méthode setattr() qui permet de modifier l'instance en cours pour lui ajouter les propriétés.
Toujours dans cet exemple on peut initialiser un grand nombre de propriétés rapidement (dans le __init__) tout en gardant le contrôle sur ce qui est ajouté dans cette instance (méthode __setattr__())
blog comments powered by Disqus
@property
Un décorateur @property contenu dans la librairie standard est à poser au-dessus de la méthode qui implémente la récupération de la propriété : cela permet de définir le getter.Le setter sera un décorateur à apposer au-dessus de la méthode mettant à jour la propriété. Le nom du décorateur varie en fonction du nom de la méthode du getter. Ici on retrouvera birth_date après l'arobase pour le setter car c'est le nom de la méthode getter. On suivra ce nom par un point et le mot setter
Vous avez vu que l'accès à la propriété year ne contient pas de parenthèse (alors que l'on a défini une méthode), c'est le décorateur qui fait le lien automatiquement.
De cette manière nous protégeons également la propriété privée
__birth_date
d'un accès public.Pour rappel, une propriété privée porte un double underscore devant son nom mais il s'agit bien d'une convention.
Ainsi on peut assez facilement accéder à cette propriété depuis
__dict__
Vous allez me dire que l'on aurait très bien pu se passer de ces 2 méthodes et mettre en place la manipulation directe de l'attribut birth_date (cette fois sans le dunder).
Mais il peut être intéressant de passer par des méthodes lorsque l'on a besoin de faire des transformations. Ici nous allons calculer son âge à partir de sa date de naissance
Vous avez remarqué que le setter sur year ne fonctionne pas, car nous n'avons pas mis en place le décorateur @year.setter
De cette façon on se protège de la mise à jour de propriété
__setattr__
Cette méthode comprise dans la librairie standard permet d'être exécuté lorsque le code met à jour une propriété. A l'intérieur de cette méthode on peut définir nos règles
Ici on retrouve une classe plus légère mais moins lisible.
L'usage de setattr peut être intéressante quand vous avez besoin d'initialiser plusieurs propriétés
Dans l'exemple ci-dessus nous utilisons la méthode setattr() qui permet de modifier l'instance en cours pour lui ajouter les propriétés.
Toujours dans cet exemple on peut initialiser un grand nombre de propriétés rapidement (dans le __init__) tout en gardant le contrôle sur ce qui est ajouté dans cette instance (méthode __setattr__())