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 envolturaUso del Decorador
Explicación
- Definición del Decorador:
mi_decoradores una función que toma otra funciónfunccomo argumento y define una función internaenvolturaque extiende el comportamiento defunc. - Uso del Decorador: El decorador se aplica a
di_holausando la sintaxis@mi_decorador. Esto es equivalente adi_hola = mi_decorador(di_hola). - Ejecución: Cuando
di_holase 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 decoradorUso del Decorador con Argumentos
Explicación
- Definición del Decorador con Argumentos:
repetires una función que toma un argumentony devuelve un decorador. - Decorador Interno: El decorador interno
decoradortoma la funciónfuncy defineenvolturaque llama afuncnveces. - 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:
@staticmethodindica quemetodo_estaticono recibe una referencia a la instancia (self) ni a la clase (cls). - Método de Clase:
@classmethodindica quemetodo_de_claserecibe 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
