📦 Proyecto: PyZon Marketplace
En este reto debes construir el backend de una plataforma de comercio electrónico. El objetivo es demostrar dominio sobre Herencia, Polimorfismo, Encapsulamiento y Métodos Mágicos.
📋 Especificaciones Técnicas
El sistema debe cumplir con los siguientes requisitos funcionales. Tú decides qué clases crear y cómo relacionarlas, salvo que se especifique lo contrario.
1. Gestión de Productos (Catálogo)
La tienda vende distintos tipos de productos. Todos tienen un nombre y un precio base. Sin embargo, el precio final que paga el cliente varía según el tipo:
- Productos Físicos:
- Tienen un peso (kg).
- El precio final se calcula:
Precio Base + Impuestos (21%) + Costo Envío. - Regla de Envío: 2€ por cada kg de peso.
- Productos Digitales:
- No tienen envío.
- El precio final es simplemente el
Precio Base(sin impuestos adicionales en nuestra jurisdicción, o ya incluidos). - Son irreversibles (no se pueden devolver).
2. Gestión de Usuarios y Cartera (Seguridad)
El sistema debe gestionar usuarios. De cada usuario nos interesa su nombre y su Dinero Disponible.
- Requisito de Seguridad (Encapsulamiento): El saldo del usuario NO debe ser accesible directamente (
usuario.saldo = 1000debe estar prohibido). - Debes proporcionar métodos seguros para:
depositar_saldo(cantidad): Ingresa dinero.consultar_saldo(): Devuelve el saldo actual.pagar(cantidad): Resta saldo solo si tiene suficiente. Si no, debe avisar del error y devolverFalse.
3. El Carrito de Compra (Experiencia de Uso)
Queremos que los programadores que usen tu librería puedan gestionar el carrito de forma intuitiva usando operadores de Python:
- Añadir productos (
+):- Sintaxis deseada:
mi_carrito + nuevo_producto - Acción: Añade el producto a la lista interna del carrito.
- Sintaxis deseada:
- Contar productos (
len):- Sintaxis deseada:
len(mi_carrito) - Acción: Devuelve el número de artículos.
- Sintaxis deseada:
- Finalizar Compra:
- Debe tener un método
checkout(usuario)que:- Calcula el total de todos los productos (usando sus precios finales polimórficos).
- Intenta cobrar al usuario.
- Si el pago es correcto, vacía el carrito y confirma la orden.
- Debe tener un método
4. La Tienda (Inventario)
La clase principal PyZon debe organizar el inventario:
- Debe usar un Diccionario para clasificar productos por etiquetas o categorías (ej: "Tecnología", "Hogar").
- Debe permitir buscar productos por nombre.
🧪 Script de Validación
Tu código debe funcionar con el siguiente script de prueba (puede requerir ajustes según tus nombres de métodos):
# 1. Configuración
tienda = PyZon()
p1 = ProductoFisico("Teclado Mecánico", precio=50, peso=1.5) # Envío: 1.5*2 = 3€ | +IVA
p2 = ProductoDigital("Licencia Windows", precio=20) # Precio fijo
tienda.registrar_producto(p1, categoria="Tecnología")
tienda.registrar_producto(p2, categoria="Software")
# 2. Usuario
user = Usuario("Alex")
user.depositar_saldo(100) # Saldo: 100€
# 3. Compra
carrito = Carrito()
carrito = carrito + p1 # Operador +
carrito = carrito + p2
print(f"Items en carrito: {len(carrito)}")
# 4. Checkout
# El costo debería ser:
# Teclado: 50 + 21%(10.5) + Envío(3) = 63.5€
# Windows: 20€
# Total: 83.5€
# El usuario tiene 100€, debería funcionar.
exito = carrito.checkout(usuario=user)
if exito:
print(f"Compra realizada. Saldo restante: {user.consultar_saldo()}€")
else:
print("Saldo insuficiente.")
¡Suerte con la arquitectura!