@property
Bonsoir,
L'article de Thibault sur property m'a permis de comprendre en parti ce que c'était., mais j'ai l'impression d'être â côté de la plaque...
Dans le code 1 ci-dessous @property permet de récupérer la valeur de l'attribut d'instance "numero".
le @numero.setter permet de le modifier.
Déjà, en paramètre on a value. Pourtant on ne définit pas la valeur de cette manière compte.numero(value="123456789").
C'est l'utilité du paramètre que je trouve bizarre.
Mais il y a forcément une raison si c'est comme ça.
Code 1:
class CompteBancaire:
def __init__(self):
self._numero = "83947382738"
@property
def numero(self):
return self._numero
@numero.setter
def numero(self, value):
if value.isdigit():
self._numero = value
else:
raise ValueError("Le numéro du compte ne peut contenir que des chiffres.")
compte = CompteBancaire()
compte.numero = "123456789" # Fonctionne
print(compte.numero)
Ensuite j'ai modifié pour refaire un code 2
Ici je n'utilise pas property et je fais la même chose.
Pk utiliser property du coup ?
il y a des utilisations pour des cas particuliers ?
code 2:
class CompteBancaire:
def __init__(self):
self.numero = "83947382738"
compte = CompteBancaire()
compte.numero = "123456789"
print(compte.numero)
Merci d'avance
Salut Gabriel,
regardes ce fil de discussion qu'on a eu avec David récemment. https://www.docstring.fr/accompagnement/questions/421/
L'intérêt de property et du setter c'est de pouvoir protéger l'attribut. Si tu ne mets pas de setter personne ne peut modifier l'attribut en dehors de la classe. Si tu en mets tu peux contrôler la manière dont il est modifié.
Pour ce qui est de ta question sur pourquoi dans le setter on a un paramètre ... En fait quand tu fais
attribut = nouvelle_valeur
tu appelles ce paramètre. Regardes l'exemple ci dessous:
In [10]: class Voiture:
...: def __init__(self, marque, prix):
...: self.marque = marque
...: self._prix = prix
...:
...: @property
...: def prix(self):
...: print("je suis la property. Je suis appelé ici")
...: return self._prix
...:
...: @prix.setter
...: def prix(self, new_val):
...: print("je suis le setter. Je suis appelé ici")
...: if new_val < self._prix:
...: raise ValueError("attention on ne va pas faire du lowcost !!")
...: self.prix = new_val
In [11]: voiture = Voiture("lambo", 1000)
In [12]: voiture.prix
je suis la propertye. Je suis appelé ici
Out[12]: 1000
In [13]: voiture.prix = 500
je suis le setter. Je suis appelé ici
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Input In [13], in <module>
----> 1 voiture.prix = 500
Input In [10], in Voiture.prix(self, new_val)
13 print("je suis le setter. Je suis appelé ici")
14 if new_val < self._prix:
---> 15 raise ValueError("attention on ne va pas faire du lowcost !!")
16 self.prix = new_val
ValueError: attention on ne va pas faire du lowcost !!
A ta disposition si ce n'est pas clair.
Salut Gabriel,
oui c'est ça. regarde ici sans le setter: je peux accéder au prix pour le consulter mais je ne peux pas lui attribuer un nouveaux prix.
Maintenant avec un setter, je peux lui attribuer un nouveaux prix tout en contrôlant sa valeur:
Tu verras aussi qu'on a toujours accès à l'attribut "_prix" mais le "_" devant t'indique que c'est très mal de le modifier. C'est une convention entre gens responsables qui est respectée chez les dev python =D
A ta dispo. On va en discuter pendant le mentorat.
D'accord merci PA ! 😁
La différence entre mon code 1 et code 2 dans mon premier post, c'est que dans le code 2, je n'ai pas property. On peut modifier ou appeler la valeur du numéro. Donc c'est principalement pour contrôler la valeur qu'on attribut à l'attribut le @property ? Si je n'ai pas besoin de contrôler la valeur je peux ne pas utiliser de property ? Donc pas de get set ?
Alors oui mais il y a une autre subtilité... Je te laisse y réfléchir et j'en parlerai demain.
Imagines que tu as une classe Rectangle avec 2 attributs définis par un paramètre largeur et un paramètre longueur. Tu définis aussi un attribut area. Qu'est ce qu'il se passe si tu mets à jour la longueur ou la largeur ou même les 2 .... =D
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte