python-modificadores-acceso

Modificadores de acceso en Python

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("Juan")
print(persona.saludar())  # Salida: Hola, soy Juan

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 😉.