Skip to content

Commit c617874

Browse files
authored
Merge pull request mouredev#7948 from idiegorojas/main
mouredev#23 - Python
2 parents 961b45b + a979469 commit c617874

File tree

2 files changed

+240
-0
lines changed

2 files changed

+240
-0
lines changed
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
"""
2+
#23 - Patron de diseño Singleton
3+
"""
4+
# Es un patron de diseño que se asegura que una clase solamente tenga una instancia
5+
# Proporciona un punto de acceso global a esa instancia
6+
# En pocas palabras es tener algo que todos usan
7+
# Ejemplo: Un telefono fijo en la casa
8+
9+
"""
10+
Estrucutra basica
11+
"""
12+
# _instance: Variable para guardar un objeto unico
13+
# __new__: Controla si ya existe un objeto o si hay que crearlo
14+
# Si hay un objeto, no se crea otro, solo se devuelve
15+
16+
class AlgoUnico:
17+
_instance = None # Caja donde guardamos el objeto unico
18+
19+
def __new__(cls): # Funcion que decide que hacer
20+
if cls._instance is None: # Si la caja esta vacia
21+
cls._instance = super().__new__(cls) # Crea el objeto si no existe
22+
return cls._instance # Devuelve lo que hay en la caja
23+
24+
"""
25+
Como se compone
26+
"""
27+
# La clase: Define que cosa unica estamos creando(telefono, una impresora...)
28+
# Variable estatica _instance: Almacena el unico objeto y compoartida por toda la clase
29+
# Control de creacion __new__: Asegura que no se hagan copias extras
30+
# Atributos o metodos: Lo que quiero que haga el Singleton
31+
32+
33+
"""
34+
Para que se usa
35+
"""
36+
# Cuando se necesita un solo recurso compartido en todo el programa
37+
# Se quiere que todos accedan a lo mismo y vean los mismo cambios
38+
# Evitar desperdiciar memoria creando muchas copias innecesarias
39+
40+
41+
"""
42+
Ejemplo 1
43+
"""
44+
# Cafetera compartida en una oficina
45+
46+
class Cafetera:
47+
_instance = None
48+
49+
def __new__(cls):
50+
if cls._instance is None:
51+
cls._instance = super().__new__(cls)
52+
cls._instance.tipo_cafe = 'expresso' # Sabor inicial
53+
return cls._instance
54+
55+
def cambiar_cafe(self, nuevo_tipo):
56+
self.tipo_cafe = nuevo_tipo
57+
print(f'La cafetera ahora tiene {self.tipo_cafe}')
58+
59+
cafetera1 = Cafetera()
60+
cafetera2 = Cafetera()
61+
62+
print(cafetera1.tipo_cafe)
63+
cafetera2.cambiar_cafe('Americano')
64+
print(cafetera1.tipo_cafe)
65+
print(cafetera1 is cafetera2)
66+
67+
68+
"""
69+
Ejemplo 2
70+
"""
71+
# Control tv en casa
72+
73+
class ControlTv:
74+
_instance = None
75+
76+
def __new__(cls):
77+
if cls._instance is None:
78+
cls._instance = super().__new__(cls)
79+
cls._instance.volumen_tv = 10
80+
return cls._instance
81+
82+
def subir_volumen(self):
83+
self.volumen_tv += 5
84+
print(f'El volumen ahora es de {self.volumen_tv}')
85+
86+
87+
control1 = ControlTv()
88+
control2 = ControlTv()
89+
90+
print(control1.subir_volumen())
91+
print(control2.subir_volumen())
92+
93+
94+
"""
95+
Extra
96+
"""
97+
98+
class SesionUsuario:
99+
_instance = None
100+
101+
id: int = None
102+
uesername: str = None
103+
name: str = None
104+
mail: str = None
105+
106+
def __new__(cls):
107+
if not cls._instance:
108+
cls._instance = super(SesionUsuario, cls).__new__(cls)
109+
return cls._instance
110+
111+
112+
def set_user(self, id, username, name, mail):
113+
self.id = id
114+
self.uesername = username
115+
self.name = name
116+
self.mail = mail
117+
118+
def get_user(self):
119+
return f'ID: {self.id}, Username: {self.uesername}, Nombre: {self.name}, Email: {self.mail}'
120+
121+
def clear_user(self):
122+
self.id = None
123+
self.uesername = None
124+
self.name = None
125+
self.mail = None
126+
127+
128+
session1 = SesionUsuario()
129+
print(session1.get_user())
130+
session1.set_user(1, "mouredev", "Brais Moure", "[email protected]")
131+
print(session1.get_user())
132+
133+
session2 = SesionUsuario()
134+
print(session2.get_user())
135+
136+
session3 = SesionUsuario()
137+
session3.clear_user()
138+
print(session3.get_user())
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
"""
2+
24 - Patrones de Diseño: Decoradores
3+
"""
4+
# Es un patron estructural que permite agregar funcionalidad a un objeto
5+
# No modifica la estrucura original del objeto
6+
# Se usa para extender el comportamiento de clases sin usar herencia
7+
8+
9+
"""
10+
Estructura basica
11+
"""
12+
# Componente base: La funcionalidad basica que se desea extender
13+
# Decorador: Funcion o clase que toma un componente y le añade nuevas funcionalidades
14+
# Uso del decorador: Se aplica a un objeto, una funcion o metodo para modificar su comportamiento
15+
16+
17+
"""
18+
Ejemplo:
19+
"""
20+
21+
# Cafeteria
22+
# Tenemos una cafetería donde vendemos café. Un café básico cuesta $2, pero los clientes pueden agregar extras como leche, azúcar o canela.
23+
24+
class Cafe:
25+
def costo(self):
26+
return 2 # Precio base del cafe
27+
28+
def descripcion(self):
29+
return 'Cafe basico'
30+
31+
class Leche:
32+
def __init__(self, cafe) -> None:
33+
self.cafe = cafe
34+
35+
def costo(self):
36+
return self.cafe.costo() + 0.5
37+
38+
def descripcion(self):
39+
return self.cafe.descripcion() + ' con leche'
40+
41+
class Azucar:
42+
def __init__(self, cafe) -> None:
43+
self.cafe = cafe
44+
45+
def costo(self):
46+
return self.cafe.costo() + 0.2
47+
48+
def descripcion(self):
49+
return self.cafe.descripcion() + ' con azucar'
50+
51+
52+
# Cafe basico
53+
cafe_basico = Cafe()
54+
print(f'El cafe que pediste es: {cafe_basico.descripcion()} y tiene un costo de: ${cafe_basico.costo()}')
55+
56+
# Cafe con leche
57+
cafe_leche = Leche(cafe_basico)
58+
print(f'El cafe que pediste es: {cafe_leche.descripcion()} y tiene un costo de: ${cafe_leche.costo()}')
59+
60+
# Cafe con leche y azucar
61+
cafe_leche_azucar = Azucar(cafe_leche)
62+
print(f'El cafe que pediste es: {cafe_leche_azucar.descripcion()} y tiene un costo de: ${cafe_leche_azucar.costo()}')
63+
64+
"""
65+
¿Cuándo usar el patrón decorador?
66+
"""
67+
# Cuando queremos extender funcionalidades sin modificar el código original.
68+
# Para modularizar y reutilizar código fácilmente.
69+
# Cuando necesitamos aplicar múltiples comportamientos dinámicos (Ej: logging, permisos, validaciones, caching).
70+
71+
"""
72+
Extra
73+
"""
74+
75+
def call_counter(function):
76+
def counter_function():
77+
counter_function.call_count += 1
78+
print(
79+
f"La función '{function.__name__} se ha llamado {counter_function.call_count}' veces.")
80+
return function
81+
82+
counter_function.call_count = 0
83+
return counter_function
84+
85+
86+
@call_counter
87+
def example_function_1():
88+
pass
89+
90+
91+
@call_counter
92+
def example_function_2():
93+
pass
94+
95+
96+
example_function_1()
97+
example_function_1()
98+
example_function_1()
99+
example_function_2()
100+
example_function_1()
101+
example_function_2()
102+
example_function_2()

0 commit comments

Comments
 (0)