Encapsulation

Comment protéger les données d'un objet contre les modifications non autorisées ? L'encapsulation est le bouclier de la programmation orientée objet, garantissant l'intégrité des données.

Difficulté:
55 min
+70 XP

Objectifs du cours

  • Comprendre le principe d'encapsulation en programmation
  • Maîtriser les attributs publics, protégés et privés en Python
  • Utiliser les propriétés (@property) pour contrôler l'accès aux données
  • Appliquer les principes de la programmation orientée objet
  • Concevoir des classes robustes et maintenables

Erreurs courantes à éviter

  • Exposer directement tous les attributs sans protection
  • Confondre _ (protégé) et __ (privé) en Python
  • Oublier les setters quand la modification est nécessaire
  • Créer des getters/setters inutiles sans logique métier

L'**encapsulation** est un principe fondamental de la programmation orientée objet (POO) qui consiste à :

1. **Regrouper** les données (attributs) et les comportements (méthodes) dans une même entité (classe) 2. **Masquer** les détails d'implémentation interne 3. **Contrôler** l'accès aux données via des méthodes dédiées

**Analogie** : Pensez à un distributeur automatique. Vous interagissez avec l'interface (boutons, écran) sans accès direct à la mécanique interne. Vous ne pouvez pas modifier le compteur d'argent directement !

**Avantages** : - **Sécurité** : les données ne peuvent pas être corrompues accidentellement - **Flexibilité** : l'implémentation peut changer sans impacter le code utilisateur - **Maintenabilité** : le code est plus facile à débugger et faire évoluer - **Cohérence** : les invariants de l'objet sont toujours respectés

Python
# Sans encapsulation : DANGEREUX !
class CompteBancaireDangereux:
    def __init__(self, solde_initial):
        self.solde = solde_initial  # Attribut public, modifiable par tous
        self.decouvert_autorise = -500

# Problème : n'importe qui peut faire n'importe quoi
compte = CompteBancaireDangereux(1000)
compte.solde = 1000000  # Fraude ! Aucune vérification
compte.solde = "beaucoup"  # Type incorrect, erreur plus tard
print(compte.solde)

# Avec encapsulation : SÉCURISÉ
class CompteBancaireSecurise:
    def __init__(self, solde_initial):
        self._solde = solde_initial  # Attribut protégé
        self._decouvert_autorise = -500

    def deposer(self, montant):
        """Dépose de l'argent sur le compte."""
        if montant <= 0:
            raise ValueError("Le montant doit être positif")
        self._solde += montant

    def retirer(self, montant):
        """Retire de l'argent si le solde le permet."""
        if montant <= 0:
            raise ValueError("Le montant doit être positif")
        if self._solde - montant < self._decouvert_autorise:
            raise ValueError("Solde insuffisant")
        self._solde -= montant

    def consulter_solde(self):
        """Retourne le solde actuel."""
        return self._solde

Quiz de validation

1. Quel est l'objectif principal de l'encapsulation ?

2. En Python, que se passe-t-il avec un attribut nommé __secret ?

3. À quoi sert le décorateur @property ?

4. Quelle est la différence entre _attribut et __attribut ?

5. Quand NE PAS utiliser l'encapsulation ?

EdTech AI Assistant