Encapsulamiento

Encapsulamiento y niveles de acceso


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.