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