Encapsulation et protection des données¶
Jusqu’ici, on a appris à créer des objets avec :
- des attributs
- des méthodes
- un état qui évolue dans le temps
Mais il y a un petit problème.
Pour l’instant, tout est accessible de partout.
Et même si ça marche, ce n’est pas toujours une bonne idée.
Le problème : trop de liberté¶
Prenons un exemple simple :
compte.solde = -1_000_000
Techniquement, Python ne dit rien. Mais logiquement… ça n’a aucun sens, on ne peut pas avoir d'argent négatif (en vrai avec les dettes on peut mais on va dire que dans notre cas non).
Le souci, ce n’est pas que le code plante. Le souci, c’est que n’importe quelle partie du programme peut casser l’état d’un objet.
Plus un programme grandit :
- plus ce genre de problème devient fréquent
- plus les bugs sont difficiles à retrouver
L’idée de l’encapsulation¶
L’encapsulation, c’est une idée très simple :
Un objet doit contrôler lui-même son propre état.
Autrement dit :
- on évite de modifier directement les attributs sensibles
- on passe par des méthodes
- l’objet décide ce qui est autorisé ou non
Attributs “privés” en Python¶
En Python, il n’existe pas de vrais attributs privés comme dans certains autres langages.
Mais il existe des conventions, et elles sont très importantes.
Le simple underscore _¶
Un attribut qui commence par _ est considéré comme interne à la classe.
class CompteBancaire:
def __init__(self, solde):
self._solde = solde
Cela signifie :
“Tu peux y accéder… mais tu ne devrais pas.”
Ce n’est pas une protection technique, c’est une protection mentale.
Modifier l’état via des méthodes¶
Au lieu de faire ça :
compte._solde -= 50
On préfère écrire :
compte.retirer(50)
Et dans la méthode :
class CompteBancaire:
def __init__(self, solde):
self._solde = solde
def retirer(self, montant):
if montant <= self._solde:
self._solde -= montant
Avantages :
- l’objet reste cohérent
- les règles sont centralisées
- le code est plus lisible
- les erreurs sont évitées
Pourquoi c’est vraiment important¶
Sans encapsulation :
- l’état peut devenir invalide
- les règles sont éparpillées
- chaque modification est risquée
Avec encapsulation :
- une seule source de vérité
- un comportement prévisible
- un code beaucoup plus robuste
Et surtout :
si les règles changent, on modifie un seul endroit.
Quizz¶
Regardez ce code :
class Personnage:
def __init__(self, vie):
self.vie = vie
Quel est le principal problème de cette classe ?
- Elle est trop courte
- Elle ne respecte pas la syntaxe Python
- *N’importe quelle partie du programme peut mettre la vie à une valeur incohérente, par exemple négative.
- Il manque une méthode `print`
> Sans encapsulation, l’état peut être modifié librement, ce qui rend le programme fragile.
Exercice pratique¶
Reprenez une classe que vous avez déjà écrite (par exemple Mamie ou CompteBancaire).
Identifiez les attributs qui ne devraient pas être modifiés directement
Renommez-les avec un _
Créez des méthodes pour :
- modifier l’état proprement
- empêcher les valeurs incohérentes
Exemples de règles possibles :
- pas de solde négatif
- pas de niveau inférieur à 1
- pas de points d'expérience flottants
En résumé¶
L’encapsulation permet de :
- protéger l’état d’un objet
- éviter des bugs difficiles à détecter
- centraliser les règles
- écrire du code plus propre et plus fiable
La programmation orientée objet ne consiste pas à cacher pour cacher,
mais à reprendre le contrôle sur l’état de ses objets.
Dans la page suivante, on va voir comment rendre nos objets encore plus agréables à utiliser, en personnalisant leur affichage.