Python 使用类模拟一个在线购物车,支持添加商品、删除商品等操作(一文讲透)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
在电商系统中,购物车是一个核心功能模块,它需要支持商品的添加、删除、数量调整、总价计算等操作。本文将通过 Python 的面向对象编程(OOP)思想,模拟一个在线购物车,并逐步实现其核心功能。通过这个案例,读者不仅能掌握 Python 类和对象的基础知识,还能理解如何将抽象需求转化为具体的代码逻辑。
一、购物车的功能需求分析
在正式编写代码前,我们需要明确购物车需要实现哪些功能:
- 添加商品:用户可以将商品加入购物车,并指定购买数量。
- 删除商品:用户可以删除购物车中的某个商品。
- 修改商品数量:用户可以调整购物车中某个商品的数量。
- 计算总价:根据商品单价和数量,计算购物车中所有商品的总价。
- 显示购物车内容:以清晰的方式展示购物车中的商品信息。
此外,还需考虑一些边界条件,例如:
- 添加商品时,若商品已存在,是否叠加数量?
- 删除商品时,若数量不足,如何处理?
二、面向对象设计:用类构建购物车
2.1 类与对象的关系
在 Python 中,类(Class) 是一个模板,用于定义对象的属性和方法。例如,我们可以将购物车设计为一个类,每个购物车对象(Instance)则代表一个具体的购物车实例。
类的基本结构:
class ShoppingCart:
def __init__(self):
# 初始化购物车的属性,如商品列表、总价等
pass
def add_item(self, item_name, price, quantity):
# 添加商品的方法
pass
def remove_item(self, item_name, quantity):
# 删除商品的方法
pass
2.2 设计购物车类的属性
购物车的核心属性包括:
- 商品列表:存储所有商品的名称、单价和数量。
- 总价:根据商品单价和数量计算得出。
使用字典存储商品信息:
我们可以用字典的键(Key)存储商品名称,值(Value)存储一个包含单价和数量的元组或字典。例如:
self.items = {
"iPhone 15": {"price": 9999, "quantity": 1},
"AirPods Pro": {"price": 1999, "quantity": 2}
}
2.3 实现添加商品功能
需求:用户可以添加商品到购物车,若商品已存在,叠加数量;若不存在,新建条目。
代码示例:
def add_item(self, item_name, price, quantity=1):
"""
添加商品到购物车
Args:
item_name (str): 商品名称
price (float): 商品单价
quantity (int): 购买数量,默认为1
"""
if item_name in self.items:
# 如果商品已存在,叠加数量
self.items[item_name]["quantity"] += quantity
else:
# 如果商品不存在,新建条目
self.items[item_name] = {"price": price, "quantity": quantity}
print(f"成功添加 {quantity} 件 {item_name}")
三、实现删除商品功能
3.1 删除逻辑设计
删除商品时需要考虑两种情况:
- 完全删除:用户希望将某商品从购物车中彻底移除。
- 部分删除:用户减少某商品的数量,但不删除。
代码逻辑:
def remove_item(self, item_name, quantity=None):
"""
删除购物车中的商品
Args:
item_name (str): 商品名称
quantity (int): 需要减少的数量,默认为None(完全删除)
Returns:
bool: 操作是否成功
"""
if item_name not in self.items:
print(f"错误:购物车中没有商品 {item_name}")
return False
if quantity is None:
# 完全删除
del self.items[item_name]
print(f"成功删除商品:{item_name}")
else:
# 部分删除
current_quantity = self.items[item_name]["quantity"]
if quantity >= current_quantity:
del self.items[item_name]
print(f"商品 {item_name} 已完全移除")
else:
self.items[item_name]["quantity"] -= quantity
print(f"成功减少 {quantity} 件 {item_name}")
return True
四、计算总价与显示购物车内容
4.1 计算总价
总价的计算需要遍历所有商品,累加(单价 × 数量)的总和。
代码实现:
def calculate_total(self):
"""
计算购物车中所有商品的总价
Returns:
float: 总价
"""
total = 0.0
for item in self.items.values():
total += item["price"] * item["quantity"]
return total
4.2 显示购物车内容
通过格式化输出,将购物车中的商品信息清晰展示。
代码示例:
def display_cart(self):
"""
显示购物车中的商品列表
"""
print("------ 购物车内容 ------")
if not self.items:
print("购物车为空")
return
for item_name, details in self.items.items():
price = details["price"]
quantity = details["quantity"]
print(f"商品:{item_name},单价:¥{price:.2f},数量:{quantity}")
print(f"总价:¥{self.calculate_total():.2f}")
五、完整代码与测试
5.1 完整购物车类代码
class ShoppingCart:
def __init__(self):
self.items = {} # 商品字典,结构为 {item_name: {"price": price, "quantity": quantity}}
def add_item(self, item_name, price, quantity=1):
if item_name in self.items:
self.items[item_name]["quantity"] += quantity
else:
self.items[item_name] = {"price": price, "quantity": quantity}
print(f"成功添加 {quantity} 件 {item_name}")
def remove_item(self, item_name, quantity=None):
if item_name not in self.items:
print(f"错误:购物车中没有商品 {item_name}")
return False
if quantity is None:
del self.items[item_name]
print(f"成功删除商品:{item_name}")
else:
current_quantity = self.items[item_name]["quantity"]
if quantity >= current_quantity:
del self.items[item_name]
print(f"商品 {item_name} 已完全移除")
else:
self.items[item_name]["quantity"] -= quantity
print(f"成功减少 {quantity} 件 {item_name}")
return True
def calculate_total(self):
total = 0.0
for item in self.items.values():
total += item["price"] * item["quantity"]
return total
def display_cart(self):
print("------ 购物车内容 ------")
if not self.items:
print("购物车为空")
return
for item_name, details in self.items.items():
price = details["price"]
quantity = details["quantity"]
print(f"商品:{item_name},单价:¥{price:.2f},数量:{quantity}")
print(f"总价:¥{self.calculate_total():.2f}")
5.2 测试案例
cart = ShoppingCart()
cart.add_item("iPhone 15", 9999, 1)
cart.add_item("AirPods Pro", 1999, 2)
cart.add_item("iPhone 15", 9999, 1) # 叠加数量
cart.display_cart()
cart.remove_item("AirPods Pro", 1)
cart.display_cart()
cart.remove_item("AirPods Pro")
cart.display_cart()
六、扩展与优化建议
6.1 功能扩展
- 折扣与优惠券:根据总价或商品类型应用折扣。
- 商品库存检查:在添加商品时,验证库存是否充足。
- 持久化存储:将购物车数据保存到文件或数据库。
6.2 代码优化
- 异常处理:在方法中添加
try-except
块,防止参数错误。 - 类型注解:为参数和返回值添加类型提示,提升代码可读性。
- 单元测试:编写测试用例,验证关键功能的正确性。
七、总结
通过本文的案例,我们实现了Python 使用类模拟一个在线购物车,支持添加商品、删除商品等操作的核心功能。这一过程不仅巩固了面向对象编程的基础知识,还展示了如何将实际需求转化为代码逻辑。对于编程初学者,可以尝试在本文代码的基础上,添加更多功能(如用户登录、商品分类);对于中级开发者,可以思考如何将这一模块与 Web 框架(如 Flask/Django)结合,构建完整的电商系统。
希望本文能帮助你理解类和对象的设计思路,并激发你用 Python 解决更多实际问题的兴趣!