如何实现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
相关产品推荐
相关产品推荐

