Ejercicio: Clase Producto
-
Diseñar una clase
Productocon nombre, precio y cantidad> -
Crear métodos para calcular el total (
precio * cantidad)> - Aplicar encapsulación en al menos un atributo>
-
Crear una clase
ProductoDescuentoque herede deProducto> - Mostrar resultados con al menos 2 productos>
¿Cómo se hace?
Paso 1. Comprender qué representa la clase Producto
La clase Producto debe representar artículos o elementos que se pueden registrar con información básica.
Los datos pedidos son:
nombrepreciocantidad
Esto significa que cada objeto tendrá:
- qué producto es,
- cuánto cuesta una unidad,
- cuántas unidades hay o se comprarán.
Paso 2. Pensar los atributos de la clase
Los atributos mínimos son:
nombrepreciocantidad
Qué significa cada uno
nombre- Identifica el producto, por ejemplo: “Cuaderno”, “Lápiz”, “Mouse”.
precio- Es el costo de una unidad del producto.
cantidad- Es el número de unidades.
Paso 3. Diseñar el constructor
La clase necesitará un método __init__ para recibir esos tres datos al crear cada producto.
La lógica será:
- recibir nombre,
- recibir precio,
- recibir cantidad,
- guardar esos valores dentro del objeto.
Aquí vuelve a aparecer el uso de self.
Paso 4. Crear un método para calcular el total
La tarea indica que se debe calcular:
precio * cantidad
Eso significa que debe haber un método que realice esa operación usando los atributos del objeto.
Por ejemplo, si:
- el precio es
15 - y la cantidad es
4
entonces el total será:
15 * 4 = 60
Qué debe hacer este método
- tomar el valor de
precio, - tomar el valor de
cantidad, - multiplicarlos,
- devolver o mostrar el resultado.
Qué conviene más
Lo mejor suele ser que el método devuelva el total, para luego usarlo al imprimir información.
Paso 5. Aplicar encapsulación a un atributo
La tarea pide usar encapsulación en al menos un atributo.
Aquí el candidato más lógico es precio, aunque también podría ser cantidad.
¿Por qué encapsular precio?
Porque normalmente el precio es un dato importante que no conviene modificar libremente desde fuera del objeto.
Entonces, en vez de usar algo como:
self.precio
se podría usar una versión protegida con doble guion bajo:
self.__precio
¿Qué implica esto?
Que desde fuera no debería alterarse directamente, sino mediante métodos diseñados para ello.
Por ejemplo:
- un método para consultar el precio,
- un método para cambiarlo de forma controlada.
La encapsulación no es solo “poner doble guion bajo”. La idea importante es controlar mejor cómo se accede y modifica la información.
Paso 6. Pensar qué métodos hacen falta en Producto
Además del constructor, podrían existir métodos como:
calcular_total()- multiplica precio por cantidad.
mostrar_info()- muestra nombre, precio, cantidad y total.
obtener_precio()- permite consultar el precio encapsulado.
cambiar_precio(nuevo_precio)- permite modificar el precio con alguna validación.
Aunque la tarea solo exige calcular el total, diseñar mejor la clase la hace más clara y útil.
Paso 7. Crear la clase ProductoDescuento
Aquí entra el concepto de herencia.
La nueva clase ProductoDescuento debe derivarse de Producto.
Eso significa que heredará:
- el nombre,
- el precio,
- la cantidad,
- y posiblemente algunos métodos.
Qué cambia entonces
La clase hija debe agregar una lógica adicional relacionada con el descuento.
Por ejemplo, además de lo que ya tenía Producto, ahora podría tener:
- un porcentaje de descuento.
Entonces, la clase hija podría calcular un total distinto:
total con descuento = total original - descuento
Paso 8. Entender la herencia en esta tarea
Clase padre
Producto
Clase hija
ProductoDescuento
La hija reutiliza lo que ya existe en la clase padre, en lugar de volver a escribir todo desde cero.
Por ejemplo, si Producto ya sabe:
- guardar nombre,
- guardar precio,
- guardar cantidad,
- calcular total,
entonces ProductoDescuento puede aprovechar eso y solo agregar el cálculo del descuento.
La herencia sirve para reutilizar código y hacer diseños más ordenados.
Paso 9. Qué podría agregar ProductoDescuento
Esta clase podría tener un nuevo atributo:
descuento
Ese descuento podría expresarse como porcentaje.
Ejemplo conceptual:
- precio = 100
- cantidad = 2
- total original = 200
- descuento = 10%
Entonces:
- descuento aplicado = 20
- total final = 180
Qué método nuevo podría tener
Un método que calcule el total con descuento.
O bien, puede sobrescribir el método de total para que ahora haga una operación diferente.
Paso 10. Sobrescritura en la tarea
Aquí se puede aplicar el concepto visto en el ejemplo de Animal y Perro.
La clase padre tiene una forma de calcular el total.
La clase hija puede redefinir ese comportamiento para incluir el descuento.
Eso sería una sobrescritura de método.
Idea conceptual
Productocalcula:precio * cantidadProductoDescuentocalcula:(precio * cantidad) - descuento
Así, ambos objetos responden al mismo tipo de acción, pero con comportamientos distintos.
Paso 11. Crear al menos dos productos
La tarea pide mostrar resultados con al menos dos productos.
Lo recomendable sería crear:
- un producto normal,
- y un producto con descuento.
Así se demuestra claramente la diferencia entre ambas clases.
Ejemplo conceptual:
Producto normal
- nombre: Cuaderno
- precio: 25
- cantidad: 4
Producto con descuento
- nombre: Mochila
- precio: 300
- cantidad: 1
- descuento: 15%
Paso 12. Mostrar resultados
Al final deben mostrarse los datos principales de cada producto:
- nombre,
- precio,
- cantidad,
- total,
- y en el caso del producto con descuento, el descuento aplicado.
La salida debe permitir comparar el funcionamiento de ambas clases.
Proceso recomendado para resolver el ejecicio
flowchart TD
A[Definir la clase Producto] --> B[Agregar atributos nombre, precio y cantidad]
B --> C[Aplicar encapsulación a un atributo]
C --> D[Crear método para calcular total]
D --> E[Crear clase ProductoDescuento]
E --> F[Heredar de Producto]
F --> G[Agregar atributo o lógica de descuento]
G --> H[Crear objetos de prueba]
H --> I[Mostrar resultados]
- ¿Cómo se hace?
- Proceso recomendado para resolver el ejecicio