Python 使用类模拟一个在线购物车,支持添加商品、删除商品等操作(一文讲透)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

在电商系统中,购物车是一个核心功能模块,它需要支持商品的添加、删除、数量调整、总价计算等操作。本文将通过 Python 的面向对象编程(OOP)思想,模拟一个在线购物车,并逐步实现其核心功能。通过这个案例,读者不仅能掌握 Python 类和对象的基础知识,还能理解如何将抽象需求转化为具体的代码逻辑。


一、购物车的功能需求分析

在正式编写代码前,我们需要明确购物车需要实现哪些功能:

  1. 添加商品:用户可以将商品加入购物车,并指定购买数量。
  2. 删除商品:用户可以删除购物车中的某个商品。
  3. 修改商品数量:用户可以调整购物车中某个商品的数量。
  4. 计算总价:根据商品单价和数量,计算购物车中所有商品的总价。
  5. 显示购物车内容:以清晰的方式展示购物车中的商品信息。

此外,还需考虑一些边界条件,例如:

  • 添加商品时,若商品已存在,是否叠加数量?
  • 删除商品时,若数量不足,如何处理?

二、面向对象设计:用类构建购物车

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 删除逻辑设计

删除商品时需要考虑两种情况:

  1. 完全删除:用户希望将某商品从购物车中彻底移除。
  2. 部分删除:用户减少某商品的数量,但不删除。

代码逻辑

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 解决更多实际问题的兴趣!

最新发布