Decoradores @staticmethod y @classmethod en Python
Clase 15 de 17 • Curso de Python Orientado a Objetos
Resumen
Domina cómo aplicar los decoradores @staticmethod y @classmethod en Python para escribir clases claras y reutilizables. Verás cómo centralizar utilidades como validar ISBN y cómo crear constructores alternativos que generan instancias con reglas específicas, sin depender de objetos previos.
Métodos estáticos y de clase en Python: organiza utilidades y crea instancias de forma flexible.
¿Qué es un static method y cómo validar ISBN en Python?
Un método estático encapsula lógica que no usa estado de instancia. No recibe self. Es perfecto para utilidades y validaciones puras. Aquí, Biblioteca.validar_isbn comprueba que un ISBN tenga al menos diez caracteres con len y retorna True o False.
# biblioteca.py
class Biblioteca:
@staticmethod
def validar_isbn(isbn: str) -> bool:
return len(isbn) >= 10
¿Cómo se llama y se prueba el método estático?
Se invoca desde la clase, sin instanciar. Se imprime el resultado para verificar la lógica.
# main.py
from biblioteca import Biblioteca
resultado = Biblioteca.validar_isbn("12345")
print("El ISBN es válido:", resultado) # False
resultado = Biblioteca.validar_isbn("1234567890")
print("El ISBN es válido:", resultado) # True
Claves prácticas: usa el decorador @staticmethod, evita self, agrupa utilidades relacionadas en la clase Biblioteca, y llama como Biblioteca.validar_isbn(valor).
¿Cómo usar un class method como constructor alternativo en la clase libro?
Un método de clase opera a nivel de clase y recibe el parámetro cls. Permite crear constructores alternativos que devuelven nuevas instancias con configuraciones predefinidas. En Libro, crear_no_disponible construye un objeto con disponible=False sin tocar el constructor principal.
# libro.py
class Libro:
@classmethod
def crear_no_disponible(cls, titulo, autor, isbn):
return cls(titulo, autor, isbn, disponible=False)
¿Cómo instanciar con el método de clase en main.py?
Se llama directamente desde la clase y se verifica el atributo disponible.
# main.py
from libro import Libro
libro_no_disp = Libro.crear_no_disponible(
titulo="Libro de prueba",
autor="Autor de prueba",
isbn="1234567890",
)
print("Libro disponible:", libro_no_disp.disponible) # False
Puntos clave: decorador @classmethod, uso de cls para crear instancias, retorno del objeto y acceso a atributos como disponible.
¿Cuáles son las diferencias clave entre staticmethod y classmethod?
Comprender las diferencias ayuda a separar la lógica de clase de la lógica de instancias, mejorando organización y mantenimiento.
- Ámbito:
@staticmethodno usaselfnicls.@classmethodrecibecls. - Propósito:
@staticmethodsirve para utilidades como validar ISBN conlen.@classmethodcrea instancias con reglas propias, como un constructor alternativo. - Invocación: ambos se llaman desde la clase. No requieren instancia previa.
- Organización: centralizan validaciones y fábricas en sus clases (
Biblioteca,Libro). - Salida:
@staticmethodretorna valores (por ejemplo,True/False).@classmethodretorna objetos configurados.
¿Te animas a aplicarlo? Crea un método de clase en Estudiante para generar un estudiante en una carrera específica y comparte tu código en los comentarios.