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