Cos'è l'incapsulamento?
Nella programmazione a oggetti, l'incapsulamento consiste nel tenere i dati di un oggetto e i metodi che lavorano su quei dati in un'unica unità, di solito una classe, nascondendo i dettagli interni così che il resto del codice possa usare l'oggetto solo tramite i suoi metodi pubblici.
Aggiornato il 24 settembre 2026
Immagina che un'app bancaria memorizzi il saldo di ogni conto in una semplice variabile. Qualsiasi riga in qualsiasi punto del programma può scrivere account.balance = -500, e niente la ferma. Quando in produzione compare un saldo negativo, devi cercare in tutto il codice ogni punto che lo ha toccato. L'incapsulamento risolve il problema: il saldo può cambiare solo tramite pochi metodi, e quei metodi fanno rispettare le regole, per esempio che un prelievo non superi mai il saldo.
Come funziona l'incapsulamento
L'incapsulamento unisce due idee:
- Raggruppare. I dati (il saldo) e il codice che lavora su di essi (deposito, prelievo) vivono nella stessa classe.
- Nascondere. Il resto del codice vede solo l'interfaccia pubblica della classe. I dati dietro di essa sono interni, quindi possono cambiare solo nei modi che la classe permette.
La regola che la classe protegge si chiama invariante: qui, "il saldo non è mai negativo". Siccome ogni modifica passa per i metodi della classe, l'invariante vale qualunque cosa faccia il resto del programma.
70
refused: not enough money
Il codice esterno può leggere acct.balance, ma la proprietà non ha un setter, quindi acct.balance = 1000 solleva un AttributeError. Se il saldo risulta sbagliato, ci sono esattamente due metodi da controllare.
L'incapsulamento in Python
Python non ha una parola chiave private. Si affida a convenzioni sui nomi che chiunque programmi in Python conosce:
name: pubblico, parte dell'interfaccia._name: interno. Niente ti impedisce di leggerlo, ma il trattino basso iniziale dice "non dipendere da questo".__name: Python lo rinomina dentro la classe (name mangling), così una sottoclasse non può sovrascriverlo per sbaglio.@property: trasforma un metodo in qualcosa che si legge come un attributo, così puoi aggiungere controlli in seguito senza cambiare il codice che lo chiama.
0
False
42
Il name mangling evita gli incidenti, non l'accesso: il nome modificato funziona comunque. Python si fida del fatto che chi programma rispetti il trattino basso. In pratica la maggior parte del codice Python usa un solo trattino basso più @property, e riserva il doppio trattino basso alle classi pensate per essere estese. Trovi altro su come scrivere classi nella documentazione sulle classi Python.
L'incapsulamento in Java, C++ e JavaScript
Altri linguaggi impongono l'occultamento. In Java, un campo private si può usare solo dentro la sua 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;
}
}
Scrivere account.balance = 1000; in un'altra classe non compila: javac segnala balance has private access in BankAccount.
| Linguaggio | Membro nascosto | Membro pubblico | Imposto da |
|---|---|---|---|
| Python | _name, __name | name | Convenzione |
| Java | private int name | public int name | Il compilatore |
| C++ | Sezione private: | Sezione public: | Il compilatore |
| JavaScript | #name | name | Il motore JavaScript |
C++ rende privati per impostazione predefinita i membri di una class e pubblici quelli di una struct. I campi privati # di JavaScript, aggiunti in ES2022, non si possono leggere in nessun modo da fuori della classe. La documentazione li tratta uno per uno: modificatori di accesso in Java, specificatori di accesso in C++ e campi privati in JavaScript.
Perché l'incapsulamento è importante
- Le regole stanno in un solo posto. Il controllo "nessun prelievo oltre il saldo" si scrive una volta, dentro
withdraw, invece che prima di ogni prelievo del programma. - Puoi cambiare l'interno liberamente. Se decidi di memorizzare il denaro in centesimi interi invece che come float, cambia solo la classe. Il codice che chiama
deposit(100)continua a funzionare. - Debug più facile. Quando un valore è sbagliato, i sospetti sono i pochi metodi che possono modificarlo, non ogni riga del programma.
- Meno da imparare e da testare. Una classe con tre metodi pubblici si può capire e testare attraverso quei tre metodi.
L'incapsulamento funziona anche sopra il livello delle classi. Un modulo che espone due funzioni e tiene interne dieci funzioni di supporto è incapsulato allo stesso modo, e così un sistema operativo che permette ai programmi di aprire file solo tramite chiamate di sistema.
Spesso lo si confonde con l'astrazione. L'astrazione decide cosa offre l'interfaccia; l'incapsulamento protegge i dati che stanno dietro. La pagina sull'astrazione ha un confronto completo tra le due. Insieme al polimorfismo e all'ereditarietà, sono i quattro pilastri della programmazione a oggetti.
Errori comuni
- Un getter e un setter per ogni campo. Un
setBalanceche accetta qualsiasi numero non protegge niente. Offri le operazioni di cui l'oggetto ha bisogno (withdraw), non l'accesso diretto a ogni campo. - Restituire oggetti interni. Un metodo che restituisce
self._itemsconsegna a chi lo chiama la lista vera, che ora può modificare. Restituisci invece una copia o una tupla. - Scambiare private per sicurezza. I modificatori di accesso prevengono gli errori, non gli attacchi. Il codice Java può leggere i campi privati tramite reflection, e il codice Python può leggere
_namedirettamente. Password e chiavi hanno bisogno di una protezione vera, come hashing e crittografia.
Cosa leggere dopo
Leggi ora astrazione, che spiega la differenza tra le due idee, poi polimorfismo. Il corso Python costruisce le classi passo dopo passo, e il corso Java mostra l'incapsulamento imposto dal compilatore.
Domande frequenti
Cos'è l'incapsulamento in parole semplici?
deposit e withdraw, che prima controllano le regole. Il nome viene da capsula, un involucro che tiene dentro il suo contenuto.Quali sono degli esempi di incapsulamento?
deposit e withdraw è l'esempio classico. La list di Python è un altro: chiami append e non gestisci mai la memoria che contiene gli elementi. Un modulo che espone poche funzioni e tiene private quelle di supporto è incapsulamento su scala più grande.Quali sono i tre tipi di incapsulamento?
Cos'è l'incapsulamento in C++ e come si usa?
private e fornisci funzioni membro public che li leggono o li modificano. I membri di una class sono privati per impostazione predefinita, mentre quelli di una struct sono pubblici. Il compilatore rifiuta qualsiasi codice fuori dalla classe che provi a usare un membro privato.