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.
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
# 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._soldeQuiz 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 ?
