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.