El encapsulamiento es uno de los pilares fundamentales de la programación orientada a objetos. Consiste en ocultar los detalles internos de un objeto —como sus atributos y métodos— para que no puedan ser accedidos directamente desde el exterior. La idea principal es proteger el estado interno del objeto y ofrecer una interfaz pública controlada para su uso.
En otras palabras, el encapsulamiento permite que ciertas partes de una clase (atributos o métodos) solo puedan ser accedidas o modificadas desde dentro de la misma clase, evitando interferencias externas indebidas.
Ventajas del encapsulamiento:
- Seguridad: Evita que partes externas modifiquen el estado interno de forma incorrecta.
- Mantenibilidad: Permite cambiar la implementación interna sin afectar el código que usa la clase.
- Control: Posibilita realizar validaciones y cálculos automáticos al acceder o modificar atributos.
- Abstracción: Oculta detalles innecesarios al usuario de la clase, mostrando solo lo esencial.
¿Cómo funciona en Python?
A diferencia de otros lenguajes como Java o C++, Python no tiene modificadores de acceso estrictos como private
, protected
o public
. Sin embargo, sigue ofreciendo mecanismos para indicar el nivel de acceso deseado:
Nivel de acceso | Convención en Python | Accesibilidad desde fuera |
---|---|---|
Público | nombre | Totalmente accesible |
Protegido | _nombre | Convención: uso interno |
Privado | __nombre | Oculto por transformación de nombre |
Ejemplo:
class Persona:
def __init__(self, nombre, edad):
self.nombre = nombre # Público
self._dni = "00000000X" # Protegido (convención)
self.__saldo = 1000 # Privado (oculto)
persona = Persona("Ana", 30)
print(persona.nombre) # Accesible
print(persona._dni) # Accesible, pero no recomendado
print(persona.__saldo) # Error: no accesible directamente
¿Realmente los privados están ocultos?
No del todo. Python aplica lo que se conoce como name mangling a los atributos que comienzan con doble guion bajo (__
). Esto significa que internamente su nombre se transforma para que no puedan ser accedidos fácilmente desde fuera:
print(persona._Persona__saldo) # Funciona, pero es una mala práctica
Acceder a atributos privados de esta manera rompe el principio de encapsulamiento. Solo se debe hacer si es estrictamente necesario y con pleno conocimiento de lo que se está haciendo.
Explorando atributos con dir():
La función dir(objeto)
permite inspeccionar los atributos y métodos disponibles en un objeto:
print(dir(persona))
Verás que __saldo
no aparece directamente, sino como _Persona__saldo
.