Comprendre les propriétés
Bonjour,
Je ne comprends pas les propriétés malgré ma lecture de plusieurs articles sur le site. Qu'est-ce-que c'est et à quoi cela sert-il svp ? Pourquoi est-ce pertinet de les utiliser comme dans l'exercice n°156 ?
Merci par avance,
Salut !
Tu parles de cet exercice j'imagine.
class Path:
def __init__(self, chemin):
self.chemin = chemin
def __str__(self):
return self.chemin
@property
def ext(self):
return self.chemin.split(".")[-1]
def dirname(self):
splits = self.chemin.split("/")[:-1]
return Path("/".join(splits))
@property
def basename(self):
basename = self.chemin.split("/")[-1]
return basename.split(".")[0]
s = Path("/Users/thibh/Documents/test.txt")
print(s.dirname().dirname())
print(s.basename)
print(s.ext)
Ici le principal intérêt est d'accéder comme un attribut sans appeler la méthode. C'est plus naturel.
Exemple :
# Sans @property
print(s.basename()) # avec les parenthèses
# Avec @property
print(s.basename) # comme un attribut, plus naturel
Prend l'exemple de basename : ce qui est retourné est une caractéristique du chemin, pas une action. Il s'agit d'un attribut calculé (donc à la volée) mais s'utilisent comme un attribut.
dirname() est une méthode classique car elle effectue une action qui retourne un nouvel objet.
Autre cas d'utilisation : l'utiliser avec un setter.
class CompteBancaire:
def __init__(self, solde_initial):
# L'underscore indique une variable interne par convention
self._solde = solde_initial
@property
def solde(self):
"""Getter : Permet de lire le solde comme un simple attribut."""
return self._solde
@solde.setter
def solde(self, montant):
"""Setter : Permet de modifier le solde avec une validation de sécurité."""
if montant < 0:
# On empêche techniquement le solde de devenir négatif
raise ValueError("Le solde ne peut pas être négatif")
self._solde = montant
# --- Zone de Test ---
compte = CompteBancaire(100)
print(f"Solde initial: {compte.solde}")
# Modification autorisée
compte.solde = 200
print(f"Après dépôt: {compte.solde}")
# Tentative de modification invalide
# Cela va lever une exception ValueError
try:
compte.solde = -50
except ValueError as e:
print(f"Erreur capturée : {e}")
On rend privé le solde avec _, on créé une propriété pour y accéder (donc pas besoin d'avoir les parenthèses). Et on définit un setter lié au getter qui permet de contrôler la modification de notre attribut privé.
Est-ce que c'est ok pour toi ? ^^
Rebonjour,
Si je comprends bien, avec une propriété on a accès au résultat d'une méthode sans l'appeler (c'est-à-dire sans avoir besoin de mettre des parenthèses à la fin de la méthode utilisée) ?
Merci
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte