diff --git a/python-ofensivo/00_ejercicios/06_decoradores01.py b/python-ofensivo/00_ejercicios/06_decoradores01.py new file mode 100644 index 0000000..7ca5418 --- /dev/null +++ b/python-ofensivo/00_ejercicios/06_decoradores01.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 +""" +Decoradores +""" + + +def mi_decorador(funcion): # Función de orden superior + + def envoltura(): # Función anidada + + print("Esto se añade antes del función desde la envoltura") + funcion() # Llamada a la función original + print("Esto se añade después del función desde la envoltura") + + return envoltura + + +@mi_decorador +def saludo(): + + print("Hola, estoy saludando dentro de la función") + + +saludo() + +@property # Getters y Setters + diff --git a/python-ofensivo/00_ejercicios/06_decoradores02.py b/python-ofensivo/00_ejercicios/06_decoradores02.py new file mode 100644 index 0000000..d0b3ada --- /dev/null +++ b/python-ofensivo/00_ejercicios/06_decoradores02.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +""" +Decoradores +""" + + +class Persona: + + def __init__(self, nombre, edad): + + self._nombre = nombre # Atributo protegido + self._edad = edad # Atributo protegido + + @property # Getter + def edad(self): # Creando Getter + + return self._edad + + @edad.setter # Setter + def edad(self, valor): # Creando Setter + + if valor <= 0: + raise ValueError("[!] La edad no puede ser cero o un numero negativo") + + self._edad = valor + + +# manolo._edad = 36 # Setter MAL HECHO +# NO SE DEBE ASIGNAR VALOR DIRECTAMENTE A UN ATRIBUTO PROTEGIDO + +manolo = Persona("Manolo", 35) +manolo.edad = 1 # Setter +print(manolo.edad) # Getter diff --git a/python-ofensivo/00_ejercicios/06_decoradores03.py b/python-ofensivo/00_ejercicios/06_decoradores03.py new file mode 100644 index 0000000..b595355 --- /dev/null +++ b/python-ofensivo/00_ejercicios/06_decoradores03.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 +""" +Decoradores +""" + +import time + +def cronometro(funcion): + def envoltura(n): # Si la función recibe parámetros se deben pasar a la envoltura + inicio = time.time() + funcion(n) # Si la función recibe parámetros se deben pasar a la función + final = time.time() + + print(f"""Tiempo de ejecución de la función {funcion.__name__}: + {round(final - inicio, 5)} segundos""") + + return envoltura + +@cronometro +def pausa_corta(num): + time.sleep(num) + +@cronometro +def pausa_larga(num): + time.sleep(num) + + +pausa_corta(2) +pausa_larga(3) diff --git a/python-ofensivo/00_ejercicios/06_decoradores04.py b/python-ofensivo/00_ejercicios/06_decoradores04.py new file mode 100644 index 0000000..ce90a33 --- /dev/null +++ b/python-ofensivo/00_ejercicios/06_decoradores04.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +""" +*args: argumentos posicionales + +**kwargs: argumentos nombrados +""" + +# EJEMPLO DE *args + + +def suma(*args): + + return sum(args) + + +# EJEMPLO DE **kwargs + +def presentacion(**kwargs): + + print("[+] Mis datos:") + for key, value in kwargs.items(): + + print(f"\t- {key}: {value}") + + +presentacion( + nombre="Juan", + edad=20, + ciudad="Medellín", + profesion="Lammer" +) diff --git a/python-ofensivo/00_ejercicios/06_decoradores05.py b/python-ofensivo/00_ejercicios/06_decoradores05.py new file mode 100644 index 0000000..42de42f --- /dev/null +++ b/python-ofensivo/00_ejercicios/06_decoradores05.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 +""" +args: argumentos posicionales +kwargs: argumentos clave +""" + +import time + + +def cronometro(funcion): + def envoltura(*args, **kwargs): + inicio = time.time() + funcion() + final = time.time() + + print(f"""Tiempo de ejecución de la función {funcion.__name__}: + {round(final - inicio, 5)} segundos""") + + if args: + print(f"Argumentos: {args}") + + if kwargs: + print(f"Argumentos clave: {kwargs}") + + return envoltura + + +@cronometro +def pausa_corta(*args, **kwargs): + time.sleep(1) + + +@cronometro +def pausa_larga(*args, **kwargs): + time.sleep(2) + + +pausa_corta(2, 3, 4, 5, 6, 7, nombre="Juan", edad=23) +pausa_larga() diff --git a/python-ofensivo/00_ejercicios/06_decoradores06.py b/python-ofensivo/00_ejercicios/06_decoradores06.py new file mode 100644 index 0000000..bd5e708 --- /dev/null +++ b/python-ofensivo/00_ejercicios/06_decoradores06.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +""" +Decoradores +""" + +import math + +PI = math.pi + + +class Circunferencia: + + def __init__(self, radio): + self._radio = radio # _radio es un atributo protegido + + @property # Getter + def radio(self): + + return self._radio + + @property + def diametro(self): + + return self._radio * 2 + + @property + def area(self): + + return round(self._radio**2 * PI, 2) + + @radio.setter # Setter + def radio(self, radio): + + if radio >= 0: + self._radio = radio + else: + raise ValueError("El radio no puede ser negativo") + + +c = Circunferencia(5) + +print(f"[+] El radio es de {c.radio} cm") +print(f"[+] El diametro es de {c.diametro} cm") +print(f"[+] El area es de {c.area} cm^2") + +print() + +c.radio = 10 +print(f"[+] El radio es de {c.radio} cm") +print(f"[+] El diametro es de {c.diametro} cm") +print(f"[+] El area es de {c.area} cm^2")