Menu
Coddy logo textTech

Qu'est-ce que l'encapsulation ?

En programmation orientée objet, l'encapsulation consiste à réunir les données d'un objet et les méthodes qui agissent sur ces données dans une seule unité, généralement une classe, et à cacher les détails internes pour que le reste du code ne puisse utiliser l'objet qu'à travers ses méthodes publiques.

Par Kevin Spektor, Cofondateur et CTO

Mis à jour le 24 septembre 2026

Imagine qu'une application bancaire stocke le solde de chaque compte dans une simple variable. N'importe quelle ligne du programme peut écrire account.balance = -500, et rien ne l'en empêche. Quand un solde négatif apparaît en production, il faut fouiller tout le code pour trouver chaque endroit qui l'a touché. L'encapsulation règle ce problème : le solde ne peut changer qu'à travers quelques méthodes, et ces méthodes font respecter les règles, par exemple qu'un retrait ne peut jamais dépasser le solde.

Comment fonctionne l'encapsulation

L'encapsulation combine deux idées :

  1. Le regroupement. Les données (le solde) et le code qui agit dessus (dépôt, retrait) vivent dans la même classe.
  2. Le masquage. Le reste du code ne voit que l'interface publique de la classe. Les données derrière elle sont internes, donc elles ne peuvent changer que de la façon dont la classe l'autorise.

La règle que protège la classe s'appelle un invariant : ici, « le solde n'est jamais négatif ». Comme chaque modification passe par les méthodes de la classe, l'invariant tient quoi que fasse le reste du programme.

70
refused: not enough money

Le code extérieur peut lire acct.balance, mais la propriété n'a pas de setter, donc acct.balance = 1000 lève une AttributeError. Si le solde est un jour faux, il y a exactement deux méthodes à examiner.

L'encapsulation en Python

Python n'a pas de mot-clé private. Il s'appuie sur des conventions de nommage que tout programmeur Python connaît :

  • name : public, fait partie de l'interface.
  • _name : interne. Rien ne t'empêche de le lire, mais l'underscore initial signifie « ne dépends pas de ceci ».
  • __name : Python le renomme à l'intérieur de la classe (name mangling), pour qu'une sous-classe ne puisse pas l'écraser par accident.
  • @property : transforme une méthode en quelque chose qui se lit comme un attribut, pour que tu puisses ajouter des vérifications plus tard sans changer le code appelant.
0
False
42

Le name mangling empêche les accidents, pas l'accès : le nom transformé fonctionne toujours. Python fait confiance aux programmeurs pour respecter l'underscore. En pratique, la plupart du code Python utilise un seul underscore plus @property, et réserve le double underscore aux classes destinées à être dérivées. Pour en savoir plus sur l'écriture de classes, consulte la documentation Python sur les classes.

L'encapsulation en Java, C++ et JavaScript

D'autres langages imposent le masquage. En Java, un attribut private ne peut être utilisé qu'à l'intérieur de sa propre classe :

public class BankAccount {
    private int balance;  // hidden from every other class

    public int getBalance() { return balance; }

    public void withdraw(int amount) {
        if (amount > balance) throw new IllegalArgumentException("not enough money");
        balance -= amount;
    }
}

Écrire account.balance = 1000; dans une autre classe ne compile pas : javac signale balance has private access in BankAccount.

LangageMembre cachéMembre publicImposé par
Python_name, __namenameConvention
Javaprivate int namepublic int nameLe compilateur
C++Section private:Section public:Le compilateur
JavaScript#namenameLe moteur JavaScript

En C++, les membres d'une class sont privés par défaut et ceux d'une struct publics. Les attributs privés # de JavaScript, ajoutés dans ES2022, ne peuvent pas du tout être lus depuis l'extérieur de la classe. La documentation couvre chacun : les modificateurs d'accès en Java, les spécificateurs d'accès en C++ et les champs privés en JavaScript.

Pourquoi l'encapsulation compte

  • Les règles vivent à un seul endroit. La vérification « pas de retrait au-dessus du solde » est écrite une fois, dans withdraw, au lieu d'être répétée avant chaque retrait du programme.
  • Tu peux modifier l'intérieur librement. Si tu décides de stocker l'argent en centimes entiers au lieu d'un float, seule la classe change. Le code qui appelle deposit(100) continue de fonctionner.
  • Un débogage plus simple. Quand une valeur est fausse, les suspects sont les quelques méthodes autorisées à la modifier, pas chaque ligne du programme.
  • Moins à apprendre et à tester. Une classe avec trois méthodes publiques peut être comprise et testée à travers ces trois méthodes.

L'encapsulation fonctionne aussi au-dessus du niveau des classes. Un module qui expose deux fonctions et garde dix fonctions utilitaires internes est encapsulé de la même façon, tout comme un système d'exploitation qui ne laisse les programmes ouvrir des fichiers qu'à travers des appels système.

On la confond souvent avec l'abstraction. L'abstraction décide de ce que l'interface propose ; l'encapsulation protège les données qui se trouvent derrière. La page sur l'abstraction contient une comparaison complète des deux. Avec le polymorphisme et l'héritage, elles forment les quatre piliers de la programmation orientée objet.

Erreurs fréquentes

  • Un getter et un setter pour chaque attribut. Un setBalance qui accepte n'importe quel nombre ne protège rien. Propose les opérations dont l'objet a besoin (withdraw), pas un accès brut à chaque attribut.
  • Renvoyer des objets internes. Une méthode qui renvoie self._items donne à l'appelant la vraie liste, qu'il peut désormais modifier. Renvoie plutôt une copie ou un tuple.
  • Confondre privé et sécurité. Les modificateurs d'accès empêchent les erreurs, pas les attaques. Du code Java peut lire les attributs privés par réflexion, et du code Python peut lire _name directement. Les mots de passe et les clés ont besoin d'une vraie protection, comme le hachage et le chiffrement.

Pour aller plus loin

Lis ensuite la page sur l'abstraction, qui explique la différence entre les deux idées, puis celle sur le polymorphisme. Le cours Python construit des classes pas à pas, et le cours Java montre l'encapsulation imposée par le compilateur.

Questions fréquentes

Qu'est-ce que l'encapsulation, en termes simples ?
L'encapsulation signifie qu'un objet garde ses données pour lui et propose quelques façons sûres de s'en servir. Un objet compte bancaire ne te laisse pas taper un nouveau solde ; il te donne deposit et withdraw, qui vérifient d'abord les règles. Le nom vient de la capsule, une enveloppe qui garde son contenu à l'intérieur.
Quels sont des exemples d'encapsulation ?
Une classe de compte bancaire qui n'autorise les modifications que par deposit et withdraw est l'exemple classique. La list de Python en est un autre : tu appelles append et tu ne gères jamais la mémoire qui stocke les éléments. Un module qui expose quelques fonctions et garde ses fonctions utilitaires privées, c'est de l'encapsulation à plus grande échelle.
Quels sont les trois types d'encapsulation ?
Les tutoriels qui en citent trois parlent généralement de l'encapsulation des variables membres (attributs privés), de l'encapsulation des fonctions (méthodes utilitaires privées) et de l'encapsulation des classes (une classe cachée dans une autre classe ou dans un module). Ce ne sont pas des catégories officielles ; c'est la même idée appliquée aux attributs, aux méthodes et aux classes entières.
Comment l'encapsulation s'utilise-t-elle en C++ ?
En C++, tu marques les données membres private et tu fournis des fonctions membres public qui les lisent ou les modifient. Les membres d'une class sont privés par défaut, alors que ceux d'une struct sont publics par défaut. Le compilateur rejette tout code extérieur à la classe qui essaie d'utiliser un membre privé.
Que signifie l'encapsulation en réseau ?
En réseau, l'encapsulation consiste à envelopper les données dans les en-têtes de chaque couche de protocole à leur sortie : un message HTTP va dans un segment TCP, qui va dans un paquet IP, qui va dans une trame Ethernet. Le nom est le même que l'idée de programmation, mais c'est un concept différent.
Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER