🐍 PyTutos

@property : transformer une méthode en attribut

Calcule et protège des attributs grâce au décorateur @property.

⏱ 9 minutes 📂 avance #avance #classes #property #decorateurs

Le décorateur @property

@property te permet de calculer ou protéger un attribut, tout en gardant la syntaxe simple obj.nom (sans parenthèses).

Exemple : attribut calculé

class Cercle:
    def __init__(self, rayon):
        self.rayon = rayon

    @property
    def aire(self):
        return 3.14159 * self.rayon ** 2

c = Cercle(5)
print(c.aire)   # 78.53975  ← pas de parenthèses, on dirait un attribut

Sans @property, il faudrait écrire c.aire().

Validation avec un setter

class Personne:
    def __init__(self, age):
        self.age = age   # appellera le setter

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, valeur):
        if valeur < 0:
            raise ValueError("L'âge ne peut pas être négatif")
        self._age = valeur


p = Personne(10)
print(p.age)     # 10
p.age = 11       # ok
p.age = -5       # ❌ ValueError

Pourquoi les _age au lieu de age ?

Parce que age est maintenant un getter, pas un attribut. On stocke la valeur "réelle" dans _age (le _ indique "interne").

Read-only (lecture seule)

Sans setter, l'attribut devient non modifiable :

class Cercle:
    def __init__(self, rayon):
        self.rayon = rayon

    @property
    def diametre(self):
        return 2 * self.rayon

c = Cercle(5)
print(c.diametre)   # 10
c.diametre = 20     # ❌ AttributeError : can't set attribute

Cas d'usage typique

class Carre:
    def __init__(self, cote):
        self.cote = cote

    @property
    def perimetre(self):
        return 4 * self.cote

    @property
    def aire(self):
        return self.cote ** 2

c = Carre(5)
print(c.perimetre)   # 20
print(c.aire)        # 25

💡 En Python, on commence simple : attribut normal. On passe à @property seulement si on a besoin de calcul ou de validation. Pas besoin de getters/setters partout comme en Java !

🧪 Quiz de validation

Réponds à toutes les questions. Il faut 70% de bonnes réponses pour valider le tuto !

🔒 Tu dois être connecté pour passer le quiz.