Séance 5 · 1 heure · Bonus — hors programme officiel

Encapsulation

Fil rouge du chapitre : créer un jeu de rôle

À annoncer en ouverture — Ce qu'on voit aujourd'hui ne peut pas tomber au bac écrit. C'est ce qui distingue un code d'élève d'un code professionnel, et ça servira pour votre projet de l'année.

Accroche Un attribut sans protection

sans_protection.py
monstre = Personnage("Gobelin", 30, 5)
monstre.pv = -9999999
print(monstre.pv)   # -9999999
À discuter — Est-ce que ça a un sens, un personnage à -9999999 pv ? Qu'est-ce qui, dans notre code actuel, empêche ça ?

Apport Attribut protégé, accesseur, mutateur

personnage_protege.py
class Personnage:
    def __init__(self, nom, pv):
        self.nom = nom
        self._pv = pv

    @property
    def pv(self):
        return self._pv

    @pv.setter
    def pv(self, valeur):
        self._pv = max(0, valeur)

@property transforme une méthode en "attribut à lire" — on continue à écrire monstre.pv sans parenthèses. @pv.setter intercepte toute écriture et applique une règle avant de stocker la valeur.

À retenir — En Python, le underscore n'est qu'une convention — rien n'empêche techniquement d'écrire monstre._pv = -999 quand même. C'est un signal fort envoyé aux autres développeurs, pas une vraie barrière technique.

Exercice — Sécuriser le personnage complet

Reprendre la classe Personnage (avec attaquer, se_soigner, est_vivant) et sécuriser pv pour qu'il reste toujours entre 0 et 100.

Voir la correction →