La encapsulación en Python es un concepto que se refiere a la restricción del acceso directo a algunos componentes de un objeto, con el objetivo de prevenir modificaciones accidentales y asegurar un uso controlado de sus atributos y métodos.
Python no implementa el encapsulamiento de manera “estricta” como otros lenguajes orientados a objetos. Pero si proporciona mecanismos que permiten gestionar la visibilidad y acceso a los miembros de una clase.
Para ello, Python utiliza convenciones de nombres para indicar la accesibilidad de los miembros de una clase.
Acceso público
Los atributos y métodos que no comienzan con un guion bajo (_
) se consideran públicos y pueden ser accedidos desde fuera de la clase.
class Persona:
def __init__(self, nombre):
self.nombre = nombre # Atributo público
def saludar(self):
return f"Hola, soy {self.nombre}" # Método público
# Uso de la clase Persona
persona = Persona("Luis")
print(persona.saludar()) # Salida: Hola, soy Luis
Acceso protegido
Los atributos y métodos que comienzan con un solo guion bajo (_
) se consideran protegidos y no deben ser accedidos directamente desde fuera de la clase.
class CuentaBancaria:
def __init__(self, saldo):
self._saldo = saldo # Atributo protegido
def mostrar_saldo(self):
return f"Saldo disponible: {self._saldo}" # Método protegido
# Uso de la clase CuentaBancaria
cuenta = CuentaBancaria(5000)
print(cuenta.mostrar_saldo()) # Salida: Saldo disponible: 5000
print(cuenta._saldo) # Acceso protegido (no recomendado pero posible)
Acceso privado
Los atributos y métodos que comienzan con dos guiones bajos (__
) se consideran privados y no deben ser accedidos directamente desde fuera de la clase.
class Estudiante:
def __init__(self, nombre):
self.__nombre = nombre # Atributo privado
def __presentarse(self):
return f"¡Hola! Soy {self.__nombre}" # Método privado
# Uso de la clase Estudiante
estudiante = Estudiante("María")
# print(estudiante.__nombre) # Error: AttributeError (no se puede acceder directamente)
# estudiante.__presentarse() # Error: AttributeError (no se puede llamar directamente)
No obstante, realmente no tenemos una encapsulación estricta. Hay formas de acceder a los campos y métodos, incluso aunque estén marcados como “privados” con __
.
Es decir, están “bastante protegidos”, pero no 100% protegidos. Aunque también os digo, que saltaros la protección casi seguro que sea siempre una mala idea 😉.