Comprendre les propriétés

# Programmation Orientée Objet (POO)

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,

Gabriel Trouvé

Mentor

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

Gabriel Trouvé

Mentor

Exactement ! C'est l'un des avantages :)

Donc tu peux calculer dynamiquement la valeur obtenu tout en l'appelant comme un attribut 😎

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.