Menu
Coddy logo textTech

¿Qué es el encapsulamiento?

En la programación orientada a objetos, el encapsulamiento (o encapsulación) consiste en mantener juntos en una unidad, normalmente una clase, los datos de un objeto y los métodos que trabajan con ellos, y ocultar los detalles internos para que el resto del código solo pueda usar el objeto a través de sus métodos públicos.

Por Kevin Spektor, Cofundador y CTO

Actualizado el 24 de septiembre de 2026

Imagina que una app bancaria guarda el saldo de cada cuenta en una variable normal. Cualquier línea de cualquier parte del programa puede escribir account.balance = -500, y nada lo impide. Cuando aparece un saldo negativo en producción, tienes que buscar en todo el código cada sitio que lo tocó. El encapsulamiento lo soluciona: el saldo solo puede cambiar a través de unos pocos métodos, y esos métodos imponen las reglas, por ejemplo que una retirada nunca puede superar el saldo.

Cómo funciona el encapsulamiento

El encapsulamiento combina dos ideas:

  1. Agrupar. Los datos (el saldo) y el código que trabaja con ellos (ingresar, retirar) viven en la misma clase.
  2. Ocultar. El resto del código solo ve la interfaz pública de la clase. Los datos que hay detrás son internos, así que solo pueden cambiar de las formas que la clase permite.

La regla que protege la clase se llama invariante: aquí, "el saldo nunca es negativo". Como todo cambio pasa por los métodos de la clase, el invariante se cumple haga lo que haga el resto del programa.

70
refused: not enough money

El código de fuera puede leer acct.balance, pero la propiedad no tiene setter, así que acct.balance = 1000 lanza un AttributeError. Si el saldo sale mal alguna vez, hay exactamente dos métodos que revisar.

El encapsulamiento en Python

Python no tiene una palabra clave private. Se apoya en convenciones de nombres que todo programador de Python conoce:

  • name: público, parte de la interfaz.
  • _name: interno. Nada te impide leerlo, pero el guion bajo inicial dice "no dependas de esto".
  • __name: Python lo renombra dentro de la clase (name mangling), para que una subclase no pueda sobrescribirlo por accidente.
  • @property: convierte un método en algo que se lee como un atributo, así que puedes añadir comprobaciones más adelante sin cambiar el código que lo llama.
0
False
42

El name mangling evita accidentes, no el acceso: el nombre transformado sigue funcionando. Python confía en que los programadores respeten el guion bajo. En la práctica, la mayor parte del código Python usa un solo guion bajo más @property, y reserva el doble guion bajo para las clases pensadas para tener subclases. Tienes más sobre cómo escribir clases en la documentación de clases de Python.

El encapsulamiento en Java, C++ y JavaScript

Otros lenguajes imponen la ocultación. En Java, un atributo private solo se puede usar dentro de su propia clase:

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;
    }
}

Escribir account.balance = 1000; en otra clase no compila: javac informa de balance has private access in BankAccount.

LenguajeMiembro ocultoMiembro públicoQuién lo impone
Python_name, __namenameLa convención
Javaprivate int namepublic int nameEl compilador
C++sección private:sección public:El compilador
JavaScript#namenameEl motor de JavaScript

C++ hace privados por defecto los miembros de una class y públicos los de un struct. Los campos privados con # de JavaScript, añadidos en ES2022, no se pueden leer en absoluto desde fuera de la clase. La documentación cubre cada caso: modificadores de acceso en Java, especificadores de acceso en C++ y campos privados en JavaScript.

Por qué importa el encapsulamiento

  • Las reglas viven en un solo sitio. La comprobación "ninguna retirada por encima del saldo" se escribe una vez, dentro de withdraw, en lugar de antes de cada retirada del programa.
  • Puedes cambiar el interior con libertad. Si decides guardar el dinero en céntimos enteros en lugar de en un float, solo cambia la clase. El código que llama a deposit(100) sigue funcionando.
  • Depurar es más fácil. Cuando un valor está mal, los sospechosos son los pocos métodos que pueden cambiarlo, no todas las líneas del programa.
  • Hay menos que aprender y que probar. Una clase con tres métodos públicos se puede entender y probar a través de esos tres métodos.

El encapsulamiento también funciona por encima del nivel de las clases. Un módulo que expone dos funciones y mantiene diez auxiliares internas está encapsulado de la misma forma, y también lo está un sistema operativo que solo deja a los programas abrir archivos mediante llamadas al sistema.

A menudo se confunde con la abstracción. La abstracción decide qué ofrece la interfaz; el encapsulamiento protege los datos que hay detrás. La página de abstracción tiene una comparación completa lado a lado. Junto con el polimorfismo y la herencia, son los cuatro pilares de la programación orientada a objetos.

Errores comunes

  • Un getter y un setter para cada atributo. Un setBalance que acepta cualquier número no protege nada. Ofrece las operaciones que necesita el objeto (withdraw), no acceso directo a cada atributo.
  • Devolver objetos internos. Un método que devuelve self._items le entrega a quien lo llama la lista real, que ahora puede modificar. Devuelve una copia o una tupla.
  • Tratar lo privado como seguridad. Los modificadores de acceso evitan errores, no ataques. El código Java puede leer atributos privados mediante reflexión, y el código Python puede leer _name directamente. Las contraseñas y las claves necesitan protección real, como el hashing y el cifrado.

Qué leer después

Lee a continuación abstracción, que explica la diferencia entre las dos ideas, y después polimorfismo. El curso de Python construye clases paso a paso, y el curso de Java muestra el encapsulamiento impuesto por el compilador.

Preguntas frecuentes

¿Qué es el encapsulamiento en palabras sencillas?
El encapsulamiento significa que un objeto se guarda sus datos para sí y ofrece unas pocas formas seguras de usarlos. Un objeto de cuenta bancaria no te deja escribir un saldo nuevo; te da deposit y withdraw, que primero comprueban las reglas. El nombre viene de una cápsula, una envoltura que mantiene su contenido dentro.
¿Qué ejemplos de encapsulamiento hay?
Una clase de cuenta bancaria que solo permite cambios mediante deposit y withdraw es el ejemplo clásico. La propia list de Python es otro: llamas a append y nunca gestionas la memoria que guarda los elementos. Un módulo que expone unas pocas funciones y mantiene privadas sus funciones auxiliares es encapsulamiento a mayor escala.
¿Cuáles son los tres tipos de encapsulamiento?
Los tutoriales que enumeran tres tipos suelen referirse al encapsulamiento de variables miembro (atributos privados), al de funciones (métodos auxiliares privados) y al de clases (una clase oculta dentro de otra clase o de un módulo). No son categorías formales; son la misma idea aplicada a atributos, métodos y clases enteras.
¿Qué es el encapsulamiento en C++ y cómo se usa?
En C++ marcas los miembros de datos como private y ofreces funciones miembro public que los leen o los cambian. Los miembros de una class son privados por defecto, mientras que los de un struct son públicos por defecto. El compilador rechaza cualquier código fuera de la clase que intente usar un miembro privado.
¿Qué significa encapsulamiento en redes?
En redes, encapsulamiento significa envolver los datos en las cabeceras de cada capa de protocolo al salir: un mensaje HTTP va dentro de un segmento TCP, que va dentro de un paquete IP, que va dentro de una trama Ethernet. Comparte el nombre con la idea de programación, pero es un concepto distinto.
Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR