Decoradores en Programación Orientada a Objetos en Python

Clase 46 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

Cuando trabajas con programación orientada a objetos en Python, los decoradores se convierten en herramientas esenciales para añadir funcionalidad específica a los métodos de tus clases. Comprender cuándo y cómo usar @staticmethod, @classmethod y @property marca la diferencia entre un código funcional y uno verdaderamente profesional.

¿Cómo funciona el decorador static method en Python?

El decorador @staticmethod se utiliza cuando un método no accede ni modifica información de la clase [0:24]. Esto quiere decir que no interactúa con atributos ni con otros métodos del objeto. Un ejemplo claro es una clase Calculadora con un método sumar que recibe dos parámetros enteros (a y b) y retorna directamente a + b.

python class Calculadora: @staticmethod def sumar(a: int, b: int) -> int: return a + b

  • El método no necesita self porque no depende del estado del objeto.
  • Recibe información desde el exterior sin interactuar con la clase.
  • Es ideal para operaciones utilitarias que no requieren contexto de instancia.

¿Cuándo usar class method para modificar atributos de clase?

A diferencia de static method, el decorador @classmethod se aplica cuando el método modifica algún aspecto de la clase [1:18]. El primer parámetro que recibe es cls, que representa a la propia clase.

python class Contador: count = 0

@classmethod def incrementar(cls): cls.count += 1

Al llamar Contador.incrementar() dos veces y luego imprimir Contador.count, el resultado es 2 [2:13]. Esto confirma que el método está modificando el atributo count que pertenece a la clase, no a una instancia particular.

  • Se usa cls en lugar de self para hacer referencia a la clase.
  • Permite modificar atributos compartidos entre todas las instancias.
  • Se invoca directamente sobre la clase, sin necesidad de crear un objeto.

¿Qué hace el decorador property y cómo actúa como getter y setter?

El decorador @property permite acceder a la funcionalidad de un método como si fuera un atributo de clase [2:33]. Esto significa que al llamarlo no se usan paréntesis, se accede con el punto directamente.

¿Cómo se implementa property como getter?

Consideremos una clase Circulo que recibe un radio de tipo flotante en su constructor [2:50]:

python class Circulo: def init(self, radio: float): self._radio = radio

@property def area(self) -> float: return 3.1416 * self._radio ** 2 @property def radio(self) -> float: return self._radio

Al crear c = Circulo(5) e imprimir c.area, obtenemos el resultado sin usar paréntesis [3:52]. La convención de agregar un guion bajo (_radio) permite diferenciar entre el atributo interno y el método que lo expone.

¿Cómo se usa property como setter para validar datos?

Para modificar información se utiliza la variante setter del decorador [4:22]. Se define colocando @radio.setter sobre un nuevo método con el mismo nombre:

python @radio.setter def radio(self, valor: float): if valor < 0: raise ValueError("El radio no puede ser negativo") self._radio = valor

  • Si asignas c.radio = 10, el área se recalcula correctamente con el nuevo valor [4:56].
  • Si asignas c.radio = -10, Python levanta un ValueError con el mensaje personalizado [5:17].

Esta técnica de validación dentro del setter es fundamental para mantener la integridad de los datos en tus objetos.

¿Por qué estos decoradores hacen tu código más profesional?

Cada uno de estos decoradores ya viene integrado en Python, por lo que no necesitas crearlos, solo invocarlos [5:35]. Su uso correcto aporta claridad y estructura:

  • @staticmethod: para métodos independientes del estado de la clase.
  • @classmethod: para métodos que modifican atributos a nivel de clase.
  • @property: para exponer métodos como atributos, tanto en lectura (getter) como en escritura (setter).

Dominar estos tres decoradores te permitirá escribir clases más limpias y con un comportamiento controlado. ¿Ya los estás aplicando en tus proyectos? Comparte tu experiencia en los comentarios.