1
+ from abc import ABC , abstractmethod
2
+
3
+ """
4
+ Principio de sustitucion de Liskov
5
+
6
+ Cada clase que hereda de otra puede usarse como su padre sin necesidad de conocer las diferencias entre ellas.
7
+
8
+ """
9
+
10
+
11
+ # El siguiente ejemplo es un ejemplo erroneo donde no se cumple el principio
12
+
13
+ class ProductoWrong (ABC ):
14
+
15
+ def __init__ (self , marca ):
16
+ self .marca = marca
17
+
18
+ @abstractmethod
19
+ def comer (self ):
20
+ print ("Comiendo: " + self .marca )
21
+
22
+ class PolloAsadoWrong (ProductoWrong ):
23
+
24
+ def __init__ (self , marca , calories ):
25
+ self .calories = calories
26
+ self .marca = marca
27
+
28
+ def comer (self ):
29
+ return super ().comer ()
30
+
31
+ class LejiaWrong (ProductoWrong ):
32
+ def __init__ (self , marca , liters ):
33
+ self .liters = liters
34
+ self .marca = marca
35
+
36
+ def comer (self ):
37
+ raise ValueError ("No puedes comer Lejia" )
38
+
39
+
40
+ # A continuacion se deja expreso una version del mismo codigo pero que cumple el principio de sustitucion de liskov
41
+
42
+ class Producto (ABC ):
43
+
44
+ def __init__ (self , name ,marca , price , categoria ):
45
+ self .name = name
46
+ self .marca = marca
47
+ self .price = price
48
+ self .categoria = categoria
49
+
50
+ @abstractmethod
51
+ def comprar (self ):
52
+ print (f"Comprando { self .name } \n Marca: { self .marca } \n Categoria { self .categoria } \n Precio ${ self .price } " )
53
+ pass
54
+
55
+
56
+ class ProductoDeAseo (Producto ):
57
+
58
+ def __init__ (self , name ,marca , price , categoria , porcentajeAccionDesinfectante ):
59
+ super ().__init__ (name ,marca , price , categoria )
60
+ self .porcentajeAccionDesinfectante = porcentajeAccionDesinfectante
61
+
62
+ def comprar (self ):
63
+ super ().comprar ()
64
+ print (f"Accion desinfectante al %{ self .porcentajeAccionDesinfectante } " )
65
+
66
+ def asear (self ):
67
+ print (f"Aseando con { self .name } al %{ self .porcentajeAccionDesinfectante } " )
68
+
69
+ class Comida (Producto ):
70
+
71
+ def __init__ (self , name ,marca , price , categoria , calories ):
72
+ super ().__init__ (name ,marca , price , categoria )
73
+ self .calories = calories
74
+
75
+ def comprar (self ):
76
+ super ().comprar ()
77
+ print (f"Calorias por porcion: { self .calories } \n " )
78
+
79
+ def comer (self ):
80
+ print (f"Comiendo { self .name } que aporta { self .calories } calorias por porción" )
81
+
82
+
83
+ polloAsado = Comida ("Pollo Asado 1 Kilo" ,"Ariztia" ,5000 ,"Platos Preparados" ,"800 Calorias" )
84
+ pure = Comida ("Pure Rustico con Bistec" ,"Genial" ,3490 ,"Platos Preparados" ,"600 Calorias" )
85
+ abrillantadorPisoFlotante = ProductoDeAseo ("Abrillantador de Piso Flotante" ,"Brillantina" ,3200 ,"Pisos" , 0 )
86
+
87
+ """
88
+ print("\n ")
89
+ polloAsado.comprar()
90
+ print("\n ")
91
+ pure.comprar()
92
+ print("\n ")
93
+ abrillantadorPisoFlotante.comprar()
94
+
95
+ print("\n ")
96
+ polloAsado.comer()
97
+ print("\n ")
98
+ abrillantadorPisoFlotante.asear()
99
+ print("\n ")
100
+ pure.comer()
101
+ """
102
+
103
+
104
+
105
+
106
+ """
107
+ Ejercicio Extra:
108
+
109
+ Crea una jerarquía de vehículos. Todos ellos deben poder acelerar y frenar, así como
110
+ * cumplir el LSP.
111
+ * Instrucciones:
112
+ * 1. Crea la clase Vehículo.
113
+ * 2. Añade tres subclases de Vehículo.
114
+ * 3. Implementa las operaciones "acelerar" y "frenar" como corresponda.
115
+ * 4. Desarrolla un código que compruebe que se cumple el LSP.
116
+
117
+ """
118
+
119
+ class Vehiculo :
120
+ def __init__ (self , name , marca , category ):
121
+ self .name = name
122
+ self .marca = marca
123
+ self .category = category
124
+
125
+ def frenar (self ):
126
+ print (f"Frenando: { self .name } " )
127
+ pass
128
+
129
+ def acelerar (self ):
130
+ print (f"Acelerando: { self .name } " )
131
+ pass
132
+
133
+
134
+
135
+ class VehiculoManual (Vehiculo ):
136
+
137
+ def __init__ (self , name , marca , category , maxWeight , minimumAge ):
138
+ super ().__init__ (name , marca , category )
139
+ self .maxWeight = maxWeight
140
+ self .minimumAge = minimumAge
141
+
142
+ def acelerar (self ):
143
+ print ("Moviendo los pies muy rapido" )
144
+ super ().acelerar ()
145
+
146
+ def frenar (self ):
147
+ print ("Dejando de Acelerar y tratar de poner los pies en el piso" )
148
+ super ().frenar ()
149
+
150
+ def subirAlVehiculo (self , weight , age ):
151
+ if (weight >= self .maxWeight ):
152
+ print ("Atencion el vehiculo lleva mucho peso!" )
153
+ if (age < self .minimumAge ):
154
+ print (f"Eres muy pequeño para este Vehiculo" )
155
+ elif (age >= self .minimumAge and weight < self .maxWeight ):
156
+ print (f"Eres adecuado para este vehiculo, siga movilizandose! :)" )
157
+
158
+
159
+ class VehiculoACombustion (Vehiculo ):
160
+
161
+ def __init__ (self , name , marca , category , cilinders , fuelType ):
162
+ super ().__init__ (name , marca , category )
163
+ self .cilinders = cilinders
164
+ self .fuel = fuelType
165
+
166
+ def acelerar (self ):
167
+ print ("Pisando el Acelerador!" )
168
+ self .subirMarchas ()
169
+ super ().acelerar ()
170
+
171
+ def frenar (self ):
172
+ print ("Presionar el Pedal de freno y Lentamente el Embrague" )
173
+ self .bajarMarchas ()
174
+ super ().frenar ()
175
+
176
+ def subirMarchas (self ):
177
+ print ("Subiendo Marchas" )
178
+
179
+ def bajarMarchas (self ):
180
+ print ("Bajando Marchas" )
181
+
182
+
183
+
184
+ class VehiculoElectrico (Vehiculo ):
185
+
186
+ def __init__ (self , name , marca , category , electricMotorsQuantity , fastCharge ):
187
+ super ().__init__ (name , marca , category )
188
+ self .electricMotorsQuantity = electricMotorsQuantity
189
+ self .fastCharge = fastCharge
190
+
191
+ def acelerar (self ):
192
+ print ("Pisando el Acelerador de forma Cool!" )
193
+ super ().acelerar ()
194
+
195
+ def frenar (self ):
196
+ print ("Presionando el Freno igual de Cool!" )
197
+ super ().frenar ()
198
+
199
+ def cargarEnElPoste (self ):
200
+ print ("Cargando el Vehiculo electrico de una forma muy Cool!" )
201
+ if (self .fastCharge ): print ("Wow!, tenemos Fast Charging!!!" )
202
+
203
+
204
+
205
+ bicicleta = VehiculoManual ("Bicicleta BMX" ,"Oddysey" ,"Deporte Extremo" , 80 , 15 )
206
+ skate = VehiculoManual ("Skate" ,"Plan B" ,"Deporte Extremo" , 80 , 5 )
207
+
208
+ motocicleta = VehiculoACombustion ("Motocicleta" , "Honda" , "City" , 1 , "Gasolina" )
209
+ auto = VehiculoACombustion ("Skyline" , "Nissan" , "Sportcar" , 8 , "Gasolina" )
210
+
211
+ tesla = VehiculoElectrico ("Model S" ,"Tesla" ,"Cool Electric Car" , 4 , True )
212
+
213
+ print ("Bicicleta BMX" )
214
+ bicicleta .subirAlVehiculo (90 ,13 )
215
+ bicicleta .acelerar ()
216
+ bicicleta .frenar ()
217
+
218
+ print ("\n Skate PlanB" )
219
+ skate .subirAlVehiculo (75 , 15 )
220
+ skate .acelerar ()
221
+ skate .frenar ()
222
+
223
+ print ("\n Motocicleta Honda" )
224
+ motocicleta .acelerar ()
225
+ motocicleta .frenar ()
226
+ print ("\n Nissan Skyline" )
227
+ auto .acelerar ()
228
+ auto .frenar ()
229
+
230
+
231
+ print ("\n Tesla Model S" )
232
+ tesla .cargarEnElPoste ()
233
+ tesla .acelerar ()
234
+ tesla .frenar ()
235
+
236
+
237
+
238
+
239
+
240
+
241
+
242
+
243
+
0 commit comments