Ejercicio: Clase Producto

  • Diseñar una clase Producto con nombre, precio y cantidad
  • Crear métodos para calcular el total (precio * cantidad)
  • Aplicar encapsulación en al menos un atributo
  • Crear una clase ProductoDescuento que herede de Producto
  • 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:

  • nombre
  • precio
  • cantidad

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:

  • nombre
  • precio
  • cantidad

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á:

  1. recibir nombre,
  2. recibir precio,
  3. recibir cantidad,
  4. 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

  1. tomar el valor de precio,
  2. tomar el valor de cantidad,
  3. multiplicarlos,
  4. 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

  • Producto calcula: precio * cantidad
  • ProductoDescuento calcula: (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]