-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathtry.py
More file actions
246 lines (150 loc) · 5.82 KB
/
try.py
File metadata and controls
246 lines (150 loc) · 5.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
# # 1. Impresora sin inyección y sin abstracción, imprime solo con tipo de papel que dice la clase. Acoplamiendo fuerte
# class GlossyPaper:
# def description(self):
# return "Glossy paper"
# class Printer:
# def __init__(self):
# self.paper = GlossyPaper() # La impresora crea su propio papel (acoplamiento fuerte)
# def print_document(self, document: str):
# print(f"Printing on {self.paper.description()}: {document}")
# printer = Printer()
# printer.print_document("Hello, world!")
# # 2. Impresora con inyección de dependencias, imprime con tipo de papel que se le pasa
# class SimplePaper:
# def description(self):
# return "Paper Simple"
# class MattePaper:
# def description(self):
# return "Papel mate"
# class Printer:
# def __init__(self, paper):
# self.paper = paper
# def print_document(self, document):
# print(f"Printing on {self.paper.description()}: {document}")
# simple = Printer(SimplePaper())
# simple.print_document("Hello, world!")
# matte = Printer(MattePaper())
# matte.print_document("Hello, world!")
# #3. Impresora con abstracción e inyección, imprime con tipo de papel que se le pasa. Además inversión de dependencias, la clase grande depende de una clase abstracta.
# from abc import ABC, abstractmethod
# class PaperType(ABC):
# @abstractmethod
# def descripcion(self):
# pass
# class GlossyPaper(PaperType):
# def descripcion(self):
# return "Papel brillante"
# class MattePaper(PaperType):
# def descripcion(self):
# return "Papel mate"
# class Printer:
# def __init__(self, paper_type: PaperType):
# self.paper_type = paper_type
# def print_document(self, document):
# print(f"Imprimiendo en {self.paper_type.descripcion()}: {document}")
# # Inyección de dependencias
# printer1 = Printer(GlossyPaper())
# printer2 = Printer(MattePaper())
# printer1.print_document("Factura 006")
# printer2.print_document("Factura 007")
# class BankAccount:
# def __init__(self, owner, balance):
# self.owner = owner # Público
# self._balance = balance # Protegido (convención)
# self.__password = "secure" # Privado
# def get_balance(self):
# return self._balance
# # Creación de cuenta
# account = BankAccount("Bob", 1000)
# print(account.owner) # ✅ Público
# print(account._balance) # ⚠️ Protegido, pero accesible
# # print(account.__password) # ❌ AttributeError
# print(account._BankAccount__password) # 🔥 Name Mangling (Evitar su uso)
# class Persona:
# """
# Clase que representa a una persona.
# Atributos:
# nombre (str): El nombre de la persona.
# edad (int): La edad de la persona.
# """
# def __init__(self, nombre, edad):
# """
# Inicializa una nueva persona.
# Args:
# nombre (str): El nombre de la persona.
# edad (int): La edad de la persona.
# """
# self.nombre = nombre
# self.edad = edad
# def saludar(self):
# """
# Método que imprime un saludo.
# """
# print(f"Hola, soy {self.nombre} y tengo {self.edad} años.")
# Juan = Persona("Juan", 30)
# Ana = Persona("Ana", 30)
# Juan.saludar()
# Ana.saludar()
# Juan.edad = 25
# Juan.saludar()
# print(Juan.edad)
# help(Persona)
class BankAccount:
def __init__(self, owner, balance):
self.owner = owner # Público
self._balance = balance # Protegido (convención)
self.__password = "secure" # Privado
def get_balance(self):
return self._balance
def get_password(self):
return self.__password
# Creación de cuenta
account = BankAccount("Bob", 1000)
print(account.owner) # ✅ Público
print(account._balance) # ⚠️ Protegido, pero accesible
print(account.get_password())
print(account.__password) # ❌ AttributeError
# print(account._BankAccount__password) # 🔥 Name Mangling (Evitar su uso)
# class Person: #Los nombres de las clases de Python se escriben en notación CapitalizedWords por convención.
# def __init__(self, name, age): #__init__ es el constructor, la función especial que se ejecuta al crear una instancia de la clase. self es arbitraria, se puede llamar como se quiera. Es el primero
# self.name = name # Atributo de instancia
# self.age = age # Atributo de instancia
# def introduce(self): #self es la referencia al objeto actual y permite acceder a sus atributos y métodos.
# return f"Hello, I am {self.name} and I am {self.age} years old."
# # puedo añadir algo dinamicamente al objeto
# person = Person("John", 30)
# print(person.introduce())
# person.height = 1.75
# print(person.height)
# person.name = "Juan"
# print(person.name)
# from typing import final
# @final
# class Vehiculo:
# pass
# class Coche(Vehiculo): # ❌ ERROR: No se puede heredar de una clase final
# pass
# print(Coche.__bases__ )
## EJEMPLOS DE PATRONES DE DISEÑO EN DJANGO
# #Clase.
# class Person:
# def __init__(self, name, age):
# self.name = name
# self.age = age
# #Clase en Django
# from django.db import models
# class Persona(models.Model):
# nombre = models.CharField(max_length=100)
# edad = models.IntegerField()
#Encapsulamiento, las clases de los modelos
# #Composición y asociación
# class Engine(models.Model):
# tipo = models.CharField(max_length=50)
# class Car(models.Model):
# engine = models.ForeignKey(Engine, on_delete=models.CASCADE)
#En el setting, inyectas dependencias, en este caso el JWTAuthentication
# REST_FRAMEWORK = {
# 'DEFAULT_AUTHENTICATION_CLASSES': [
# 'rest_framework_simplejwt.authentication.JWTAuthentication',
# ],
# }