Decoradores: Modificando el Comportamiento
Un Decorador es una función que recibe otra función como entrada y devuelve una versión "mejorada" o modificada de esa función. Imagina que es como ponerle un "envoltorio" a un regalo: el regalo (la función original) sigue ahí, pero el envoltorio (el decorador) añade estética o funcionalidades extra antes y después de abrirlo.
El Concepto: Funciones de Orden Superior
Para entender los decoradores, primero debemos aceptar tres reglas de Python:
1. Las funciones son objetos: Puedes asignarlas a variables.
2. Funciones dentro de funciones: Puedes definir una función B dentro de una función A.
3. Retorno de funciones: Una función puede devolver otra función como si fuera un dato cualquiera.
¿Cómo se escribe un Decorador?
La sintaxis utiliza el símbolo @ seguido del nombre del decorador justo encima de la función que queremos afectar.
Estructura técnica:
Un decorador típico consta de tres partes:
1. La función principal (el decorador).
2. Una función interna (llamada comúnmente wrapper o envoltura).
3. La ejecución de la función original dentro de la envoltura.
Casos de Uso Reales
Los decoradores se utilizan para separar la lógica principal de las tareas secundarias: * Logging: Registrar en una base de datos cada vez que alguien usa una función. * Validación: Comprobar si un usuario tiene permisos (login) antes de dejarlo entrar a una sección. * Cronometraje: Medir cuántos milisegundos tarda una función en procesar datos.
Dato Pro: Los decoradores permiten seguir el principio DRY (Don't Repeat Yourself). En lugar de escribir código de validación en 20 funciones, creas un decorador y lo aplicas a las 20 con una sola línea.
Reto: El Decorador de Seguridad
Vamos a simular un sistema de seguridad. Debes crear un decorador que "proteja" una función, imprimiendo un mensaje de "Verificando acceso..." antes de que la función se ejecute.
Instrucciones:
1. Define una función llamada decorador_seguridad que reciba una funcion.
2. Dentro, define la función envoltura.
3. La envoltura debe imprimir: "Verificando...".
4. Luego, debe ejecutar la funcion() original.
5. El decorador_seguridad debe retornar la envoltura.
6. Aplica el decorador con @decorador_seguridad a la función abrir_puerta que ya está definida en el código de abajo.
# Crea el envoltorio decorador: