Métodos y Atributos Privados y Protegidos en Python

Clase 52 de 63Curso de Python

Contenido del curso

Fundamentos de Programación y Python

Programación Orientada a Objetos en Python

Conceptos avanzados de Python

Métodos y estructura de clases en Python

Resumen

El encapsulamiento es uno de los pilares de la programación orientada a objetos, y dominarlo marca la diferencia entre código amateur y código profesional. En Python, decidir qué información puede verse desde el exterior y qué debe permanecer oculta es fundamental para construir clases robustas y mantenibles.

¿Qué son los atributos y métodos protegidos en Python?

Cuando trabajamos con clases, por defecto podemos acceder a todos los atributos sin restricción alguna. Sin embargo, el encapsulamiento nos permite restringir la información accesible desde el exterior [01:05]. Para indicar que un atributo o método es protegido, utilizamos la convención de un guion bajo al principio del nombre.

Esta convención no impide técnicamente el acceso desde fuera de la clase. Lo que hace es comunicar a otros programadores que esa información no debería manipularse directamente desde el exterior. Es una señal visual en el código.

python class BaseClass: def init(self) -> None: self._variable = "protected"

def _protected_method(self): print("Este es un método protegido")

Al crear una instancia y acceder a _variable o _protected_method(), Python no genera ningún error [03:15]. Esto ocurre porque la protección en Python funciona por convención, no por restricción real. Si otro programador lee el código, sabrá que ese atributo está protegido, pero aún podrá acceder a la información.

¿Cuándo se recomienda usar atributos protegidos?

  • Su uso principal es dentro de la clase y en subclases que hereden de ella.
  • No es recomendable acceder a ellos desde instancias externas, aunque sea posible.
  • Sirven como indicador claro de que esa información tiene un propósito interno.

¿Cómo funcionan los métodos y atributos privados?

Cuando necesitamos restringir el acceso de manera total, debemos usar el doble guion bajo al inicio del nombre [04:25]. Esto convierte al atributo o método en privado, y Python sí aplica una restricción real mediante un mecanismo llamado name mangling.

python class BaseClass: def init(self) -> None: self._variable = "protected" self.__private_variable = "private"

def __private_method(self): print("Esto es un método privado") def public_method(self): self.__private_method()

El método público puede llamar al método privado sin problema, porque el acceso ocurre desde dentro de la clase [05:52]. Todo lo que esté al mismo nivel de indentación dentro de la clase podrá invocar métodos y atributos privados.

¿Qué sucede al intentar acceder a un atributo privado desde fuera?

Si intentamos acceder a __private_variable desde una instancia, Python lanza un AttributeError indicando que el atributo no existe [07:08]. Incluso sugiere que tal vez quisimos acceder a la variable protegida. Esto confirma que el doble guion bajo restringe la visibilidad de forma efectiva desde el exterior.

python base = BaseClass() print(base.__private_variable) # AttributeError

¿Cuál es la diferencia práctica entre protegido y privado?

La distinción es clara y tiene impacto directo en el diseño de clases:

  • Protegido (un guion bajo): accesible desde fuera pero no recomendado. Pensado para uso interno y en subclases.
  • Privado (doble guion bajo): inaccesible desde el exterior. Solo la clase internamente puede utilizarlo.
  • Público (sin guion bajo): accesible libremente desde cualquier parte del código.

Un buen ejercicio para practicar estos conceptos es implementar una clase CuentaBancaria que contenga un método protegido para actualizar el saldo, permitiendo consultarlo de manera externa, y un método privado para registrar transacciones, ya que esa lógica solo le pertenece a la clase de manera interna [08:10].

Comprender cuándo usar cada nivel de acceso es lo que permite escribir código más seguro y profesional. ¿Ya has probado a refactorizar alguna de tus clases aplicando estos niveles de encapsulamiento?

      Métodos y Atributos Privados y Protegidos en Python