E1 · Producto que protege su stock
clase + invariantes · ★★Escribe la clase Producto con código, nombre, precio y stock. Métodos: vender(cantidad) (devuelve el importe; no permite dejar stock negativo), reponer(cantidad) y necesita_reorden(minimo=10). El precio debe ser positivo desde la creación.
Solución
class Producto:
def __init__(self, codigo, nombre, precio, stock=0):
if precio <= 0:
raise ValueError("el precio debe ser positivo")
self.codigo = codigo
self.nombre = nombre
self.precio = precio
self._stock = stock
@property
def stock(self):
return self._stock
def vender(self, cantidad):
if cantidad <= 0:
raise ValueError("cantidad inválida")
if cantidad > self._stock:
raise ValueError(f"solo hay {self._stock} unidades de {self.nombre}")
self._stock -= cantidad
return cantidad * self.precio
def reponer(self, cantidad):
if cantidad <= 0:
raise ValueError("cantidad inválida")
self._stock += cantidad
def necesita_reorden(self, minimo=10):
return self._stock < minimo
arroz = Producto("B07", "Arroz 5 lb", 4.25, 12)
print("Venta:", arroz.vender(5))
print("¿Reordenar?", arroz.necesita_reorden())
arroz.reponer(20)
print("Stock:", arroz.stock)
assert arroz.stock == 27
try:
arroz.vender(100)
except ValueError as e:
print("Rechazado:", e)
Venta: 21.25
¿Reordenar? True
Stock: 27
Rechazado: solo hay 27 unidades de Arroz 5 lb