You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Item与ShoppingCart类并完成商品字典的购物车操作?

修复后的完整代码
# 修正:去掉外层冗余元组,直接用字典存储商品数据
l_items = {
    "teddy": {'name': 'Teddy', "desc": "toy", "price": 3.21},
    "sweet": {'name': 'Rolo', "desc": 'chocolate', 'price': 1.21}
}


class Item:
    def __init__(self, name, desc, price):
        self._name = name
        self._desc = desc
        self._price = price
        # 修正:库存设为单商品独立值,原代码用总商品数作为库存不符合逻辑
        self._stock = 10

    # 用property安全访问私有属性
    @property
    def name(self):
        return self._name

    @property
    def price(self):
        return self._price

    def __repr__(self):
        # 修正属性引用错误,返回清晰的实例描述
        return f"Item(name='{self._name}', desc='{self._desc}', price={self._price})"


class ShoppingCart:
    # 修正:避免用可变默认参数,防止所有实例共享同一列表
    def __init__(self, item=None):
        self._item = item if item is not None else []

    # 从l_items字典添加商品(支持指定数量)
    def add_item(self, item_key, quantity=1):
        if item_key not in l_items:
            print(f"找不到商品:{item_key}")
            return
        item_data = l_items[item_key]
        target_item = Item(item_data['name'], item_data['desc'], item_data['price'])
        # 检查购物车是否已有该商品,有则累加数量
        for idx, (item, qty) in enumerate(self._item):
            if item.name == target_item.name:
                self._item[idx] = (item, qty + quantity)
                print(f"{target_item.name}数量更新为:{qty + quantity}")
                return
        # 没有则新增商品条目
        self._item.append((target_item, quantity))
        print(f"已添加{target_item.name} x {quantity}")

    # 根据商品名称删除
    def remove_item(self, item_name):
        for idx, (item, _) in enumerate(self._item):
            if item.name == item_name:
                del self._item[idx]
                print(f"已删除{item_name}")
                return
        print(f"购物车中无{item_name}")

    # 更新商品数量(数量为0则删除)
    def update_item(self, item_name, new_quantity):
        if new_quantity < 0:
            print("数量不能为负数")
            return
        for idx, (item, _) in enumerate(self._item):
            if item.name == item_name:
                if new_quantity == 0:
                    del self._item[idx]
                    print(f"{item_name}数量设为0,已删除")
                else:
                    self._item[idx] = (item, new_quantity)
                    print(f"{item_name}数量更新为:{new_quantity}")
                return
        print(f"购物车中无{item_name}")

    # 查看购物车内容
    def view_cart(self):
        print("购物车商品列表:")
        for item, qty in self._item:
            print(f"- {item} x {qty}")
        return self._item

    # 计算总价
    def getTotalCost(self):
        total = 0.0
        for item, qty in self._item:
            total += item.price * qty
        print(f"购物车总价:{total:.2f}")
        return total

    # 清空购物车
    def reset(self):
        self._item = []
        print("购物车已清空")

    # 判断购物车是否为空
    def isEmpty(self):
        # 修正属性拼写错误:_items -> _item
        return len(self._item) == 0


# 使用示例
if __name__ == "__main__":
    cart = ShoppingCart()
    cart.add_item("teddy", 2)
    cart.add_item("sweet")
    cart.view_cart()
    cart.getTotalCost()
    cart.update_item("Teddy", 3)
    cart.remove_item("Rolo")
    print(f"购物车是否为空:{cart.isEmpty()}")
    cart.reset()
    print(f"购物车是否为空:{cart.isEmpty()}")
关键修改说明
  • 商品数据结构:移除原代码中包裹字典的冗余元组,直接用字典存储,方便通过键名快速获取商品信息。
  • Item类优化:
    • 添加@property装饰器,安全访问私有属性,避免直接操作内部变量。
    • 修正__repr__方法的属性引用错误,返回更直观的实例描述。
    • 调整库存属性为单商品独立值,符合实际业务逻辑。
  • ShoppingCart类核心修复:
    • 替换可变默认参数item=[],避免多实例共享同一列表的问题。
    • 实现从l_items字典添加商品的逻辑,支持指定数量,自动处理重复商品的数量累加。
    • 修复getTotalCost方法:遍历商品和数量计算总价,返回结果并打印。
    • 修正isEmpty方法的属性拼写错误。
    • 完善remove_item和update_item方法,实现按名称操作商品的功能。
  • 存储结构优化:将购物车存储从单一Item实例列表改为(Item, quantity)元组列表,更贴合实际购物车的数量管理需求。

内容的提问来源于stack exchange,提问作者Silver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 03:50:39