Contenido del curso

Fundamentos de Programación y Python

Programación Orientada a Objetos en Python

Decoradores de clase en Python OOP

Resumen

Los decoradores integrados de Python transforman cómo escribes clases profesionales: te permiten declarar métodos que no tocan la instancia, métodos que modifican la clase entera y métodos que se comportan como atributos. Si ya entiendes cómo decorar funciones, aquí descubrirás cómo aplicar @staticmethod, @classmethod y @property para escribir programación orientada a objetos más limpia y expresiva.

¿Cuándo conviene usar @staticmethod en una clase?

Usa @staticmethod cuando el método no necesita acceder ni modificar atributos de la clase ni de la instancia. Es decir, cuando recibe información desde afuera y devuelve un resultado sin tocar el estado interno.

En el ejemplo de la clase Calculadora, el método sumar recibe dos enteros a y b y retorna su suma. No hay atributos que consultar, no hay otros métodos involucrados, así que el decorador @staticmethod deja claro que esa función vive dentro de la clase solo por organización.

¿Qué hace @staticmethod? Marca un método que no recibe self ni cls. Funciona como una función normal, pero agrupada dentro de una clase por contexto.

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

¿Cómo modifico atributos de clase con @classmethod?

Cuando tu método sí necesita leer o modificar información de la clase, el decorador adecuado es @classmethod. La diferencia con @staticmethod es directa: aquí sí estás interactuando con datos que viven en la clase.

En el ejemplo de la clase Contador, existe un atributo count inicializado en cero. El método incrementar recibe cls como primer parámetro (que representa la clase) y suma uno al atributo cada vez que lo invocas.

python class Contador: count = 0

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

¿Por qué el primer parámetro se llama cls?

Por convención, cls es a las clases lo que self es a las instancias: una referencia explícita. Cuando llamas Contador.incrementar() dos veces y luego imprimes Contador.count, obtienes 2. Ese resultado confirma que el método modificó el atributo de clase, no una copia local.

¿Cómo convertir un método en atributo con @property?

El decorador @property te permite acceder a un método como si fuera un atributo, sin paréntesis. Es ideal cuando quieres exponer un valor calculado o controlar la lectura y escritura de un dato.

En la clase Circulo, el constructor recibe un radius de tipo flotante y lo guarda como self._radio (la barra baja distingue al atributo del método público). A partir de ahí, dos métodos usan el decorador.

¿Cómo funciona @property como getter?

El método area calcula el área del círculo multiplicando 3.1416 por el radio al cuadrado. Al estar decorado con @property, lo invocas sin paréntesis:

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

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

Cuando creas circulo = Circulo(5) y escribes circulo.area, accedes al resultado como si fuera un atributo. Esa es la magia del getter: oculta el cálculo detrás de una sintaxis limpia.

¿Cómo uso @property como setter para validar datos?

La misma propiedad puede convertirse en setter para modificar el atributo bajo reglas que tú defines. Esto te permite validar antes de asignar.

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

Ahora circulo.radio = 10 actualiza el valor sin problema, pero circulo.radio = -10 levanta una excepción ValueError con el mensaje personalizado. Así proteges la integridad del objeto sin que quien usa la clase tenga que llamar a un método explícito de validación.

¿Cuál es la diferencia entre getter y setter con @property? El getter devuelve información cuando lees el atributo. El setter intercepta la asignación para validar o transformar el valor antes de guardarlo.

Decoradores integrados que profesionalizan tu código

Los tres decoradores que viste vienen incluidos en Python, no necesitas crearlos. Solo los invocas y suman funcionalidad inmediata a cada método:

  • @staticmethod: para utilidades que no dependen del estado de la clase ni de la instancia.
  • @classmethod: para operaciones que modifican atributos compartidos por toda la clase, recibiendo cls como referencia.
  • @property: para exponer métodos como atributos, con la opción de añadir un setter que valide cambios.

Dominar estos tres patrones cambia la forma en que diseñas clases: tu código comunica intención, evita errores y se vuelve más fácil de mantener. ¿Cuál de los tres planeas aplicar primero en tu próximo proyecto?