Introducción
Los decoradores en Python son una herramienta poderosa que permite modificar el comportamiento de una función o método sin cambiar su código. Los decoradores son funciones que envuelven otra función, permitiendo ejecutar código antes y después de la función decorada sin modificar su estructura.
Conceptos Clave
- Función Decoradora: Una función que toma otra función como argumento y extiende su comportamiento.
- Función Decorada: La función original que se pasa a la función decoradora.
- Sintaxis de Decoradores: Utiliza el símbolo
@
seguido del nombre de la función decoradora antes de la definición de la función decorada.
Ejemplo Básico de Decorador
Definición de un Decorador
def mi_decorador(func): def envoltura(): print("Algo se está haciendo antes de la función.") func() print("Algo se está haciendo después de la función.") return envoltura
Uso del Decorador
Explicación
- Definición del Decorador:
mi_decorador
es una función que toma otra funciónfunc
como argumento y define una función internaenvoltura
que extiende el comportamiento defunc
. - Uso del Decorador: El decorador se aplica a
di_hola
usando la sintaxis@mi_decorador
. Esto es equivalente adi_hola = mi_decorador(di_hola)
. - Ejecución: Cuando
di_hola
se llama, en realidad se ejecutaenvoltura
, que imprime mensajes antes y después de llamar afunc
.
Decoradores con Argumentos
Los decoradores también pueden aceptar argumentos. Para lograr esto, se necesita una capa adicional de funciones.
Ejemplo de Decorador con Argumentos
def repetir(n): def decorador(func): def envoltura(*args, **kwargs): for _ in range(n): func(*args, **kwargs) return envoltura return decorador
Uso del Decorador con Argumentos
Explicación
- Definición del Decorador con Argumentos:
repetir
es una función que toma un argumenton
y devuelve un decorador. - Decorador Interno: El decorador interno
decorador
toma la funciónfunc
y defineenvoltura
que llama afunc
n
veces. - Uso del Decorador:
@repetir(3)
aplica el decorador adi_adios
, haciendo que se ejecute tres veces cuando se llama.
Decoradores para Métodos de Clase
Los decoradores también pueden aplicarse a métodos de clase. Un uso común es el decorador @staticmethod
y @classmethod
.
Ejemplo de Decorador para Métodos de Clase
class MiClase: @staticmethod def metodo_estatico(): print("Este es un método estático.") @classmethod def metodo_de_clase(cls): print(f"Este es un método de clase de {cls}.") MiClase.metodo_estatico() MiClase.metodo_de_clase()
Explicación
- Método Estático:
@staticmethod
indica quemetodo_estatico
no recibe una referencia a la instancia (self
) ni a la clase (cls
). - Método de Clase:
@classmethod
indica quemetodo_de_clase
recibe una referencia a la clase (cls
).
Ejercicios Prácticos
Ejercicio 1: Decorador de Tiempo de Ejecución
Crea un decorador que mida y muestre el tiempo de ejecución de una función.
import time def medir_tiempo(func): def envoltura(*args, **kwargs): inicio = time.time() resultado = func(*args, **kwargs) fin = time.time() print(f"Tiempo de ejecución: {fin - inicio} segundos") return resultado return envoltura @medir_tiempo def dormir(): time.sleep(2) dormir()
Ejercicio 2: Decorador de Registro
Crea un decorador que registre el nombre de la función y los argumentos con los que fue llamada.
def registrar(func): def envoltura(*args, **kwargs): print(f"Llamando a {func.__name__} con {args} y {kwargs}") return func(*args, **kwargs) return envoltura @registrar def sumar(a, b): return a + b print(sumar(3, 5))
Soluciones
Solución al Ejercicio 1
import time def medir_tiempo(func): def envoltura(*args, **kwargs): inicio = time.time() resultado = func(*args, **kwargs) fin = time.time() print(f"Tiempo de ejecución: {fin - inicio} segundos") return resultado return envoltura @medir_tiempo def dormir(): time.sleep(2) dormir()
Solución al Ejercicio 2
def registrar(func): def envoltura(*args, **kwargs): print(f"Llamando a {func.__name__} con {args} y {kwargs}") return func(*args, **kwargs) return envoltura @registrar def sumar(a, b): return a + b print(sumar(3, 5))
Conclusión
Los decoradores son una herramienta poderosa en Python que permite modificar el comportamiento de funciones y métodos de manera flexible y reutilizable. Entender cómo funcionan y cómo aplicarlos te permitirá escribir código más limpio y eficiente. En el siguiente tema, exploraremos los generadores, otra característica avanzada de Python que facilita la creación de iteradores.
Curso de Programación en Python
Módulo 1: Introducción a Python
- Introducción a Python
- Configuración del Entorno de Desarrollo
- Sintaxis de Python y Tipos de Datos Básicos
- Variables y Constantes
- Entrada y Salida Básica
Módulo 2: Estructuras de Control
- Sentencias Condicionales
- Bucles: for y while
- Herramientas de Control de Flujo
- Comprensiones de Listas
Módulo 3: Funciones y Módulos
- Definición de Funciones
- Argumentos de Función
- Funciones Lambda
- Módulos y Paquetes
- Visión General de la Biblioteca Estándar
Módulo 4: Estructuras de Datos
Módulo 5: Programación Orientada a Objetos
Módulo 6: Manejo de Archivos
- Lectura y Escritura de Archivos
- Trabajo con Archivos CSV
- Manejo de Datos JSON
- Operaciones de Archivos y Directorios
Módulo 7: Manejo de Errores y Excepciones
- Introducción a las Excepciones
- Manejo de Excepciones
- Lanzamiento de Excepciones
- Excepciones Personalizadas
Módulo 8: Temas Avanzados
- Decoradores
- Generadores
- Administradores de Contexto
- Concurrencia: Hilos y Procesos
- Asyncio para Programación Asíncrona
Módulo 9: Pruebas y Depuración
- Introducción a las Pruebas
- Pruebas Unitarias con unittest
- Desarrollo Guiado por Pruebas
- Técnicas de Depuración
- Uso de pdb para Depuración
Módulo 10: Desarrollo Web con Python
- Introducción al Desarrollo Web
- Fundamentos del Framework Flask
- Construcción de APIs REST con Flask
- Introducción a Django
- Construcción de Aplicaciones Web con Django
Módulo 11: Ciencia de Datos con Python
- Introducción a la Ciencia de Datos
- NumPy para Computación Numérica
- Pandas para Manipulación de Datos
- Matplotlib para Visualización de Datos
- Introducción al Aprendizaje Automático con scikit-learn