Contenido del curso

Fundamentos de Programación y Python

Programación Orientada a Objetos en Python

Getter, setter y deleter con @property

Resumen

El decorador @property en Python te permite acceder a un método como si fuera un atributo, manteniendo control total sobre cómo se lee, modifica o elimina esa información. Es ideal cuando quieres proteger datos internos de una clase sin perder la simplicidad de acceso directo.

¿Qué hace el decorador @property en una clase?

Cuando defines un método con @property, le das a un atributo protegido la capacidad de exponerse de forma controlada. En el ejemplo de la clase Empleado, el atributo _salario lleva guion bajo porque es protegido, lo que indica que su acceso debe ocurrir desde dentro de la clase.

¿Qué es un atributo protegido en Python? Es una variable marcada con guion bajo (_nombre) que indica, por convención, que solo debe accederse desde dentro de la clase o sus subclases.

El método decorado con @property funciona como getter: devuelve la información almacenada en el atributo protegido. Así, al escribir empleado.salario obtienes el valor sin llamar al método con paréntesis [00:38].

¿Cómo funcionan getter, setter y deleter en property?

Un atributo gestionado con property puede tener tres comportamientos definidos por decoradores específicos. Cada uno cumple un rol distinto dentro de la misma propiedad.

  • Getter: devuelve el valor del atributo. Se activa con @property.
  • Setter: modifica el valor. Se declara con @nombre.setter y permite validar antes de asignar.
  • Deleter: elimina el atributo. Se declara con @nombre.deleter y suele incluir un mensaje o limpieza previa.

En el ejemplo, el setter valida que el salario no sea negativo. Si alguien intenta asignar un valor menor que cero, se lanza una excepción ValueError con el mensaje "el salario no puede ser negativo" [01:45]. Esta validación es justo lo que diferencia usar property de exponer el atributo directamente.

¿Cómo se ve el flujo completo en código?

Imagina que creas un objeto empleado con Ana ganando 5000. Al pedir empleado.salario recibes 5000 gracias al getter. Luego asignas empleado.salario = 6000 y el setter valida y actualiza el dato. Finalmente, del empleado.salario activa el deleter, que imprime un mensaje y borra la información [02:30].

¿Por qué usar property en lugar de acceder al atributo directamente? Porque te permite agregar validaciones, mensajes y lógica de control sin cambiar la forma en que el resto del código usa el atributo.

¿Qué pasa si falta el setter o el deleter en una property?

Aquí viene lo interesante: las tres propiedades son opcionales, pero si intentas usar una que no definiste, Python lanza un AttributeError. Por ejemplo, si eliminas el deleter y luego ejecutas del empleado.salario, recibirás un error indicando que la propiedad salario de la clase Empleado no soporta esa operación [03:50].

Lo mismo ocurre con el setter. Si no lo declaras y haces empleado.salario = 6000, Python responderá con un error señalando que el atributo no se puede modificar. Esto es útil cuando quieres atributos de solo lectura: defines únicamente el getter y bloqueas cambios de forma natural.

¿Cómo se conectan los tres métodos con el mismo nombre?

Los tres métodos comparten el nombre del atributo, salario en este caso, pero cada uno usa un decorador distinto:

  1. @property marca el getter, que es el punto de partida.
  2. @salario.setter habilita la modificación.
  3. @salario.deleter habilita la eliminación.

Python los reconoce como parte de la misma propiedad porque comparten nombre. Si cambias el nombre en uno de ellos, se rompe la conexión y deja de funcionar.

¿Cuándo conviene aplicar property en tus clases?

Usa property cuando necesites exponer un atributo pero también quieras validar entradas, calcular valores derivados o registrar accesos. Es la herramienta correcta para encapsular reglas de negocio sin obligar a quien usa la clase a llamar métodos explícitos.

Un buen ejercicio para practicar es implementar una clase Producto con tres propiedades sobre el precio:

  • Un getter que devuelva el precio actual del producto.
  • Un setter que valide que el precio y el stock sean coherentes (por ejemplo, no negativos).
  • Un deleter que elimine la información del precio cuando el producto deje de venderse.

Aplicar este patrón te prepara para escribir clases más seguras y expresivas. ¿Ya tienes una clase en tu proyecto donde property podría reemplazar accesos directos a atributos? Cuéntame cómo la rediseñarías.