Update Python Ofensivo

This commit is contained in:
Manuel Vergara 2023-12-26 23:56:20 +01:00
parent 490afce41f
commit e300dee83f
6 changed files with 210 additions and 0 deletions

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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"
)

View File

@ -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()

View File

@ -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")