酒吧库存程序:库存修改不持久及代码重构参数问题
酒吧程序开发问题解决方案
问题1:库存修改无法持久化
当前库存仅保存在内存中,程序重启后会重置为初始值。解决思路是将库存数据持久化到文件,推荐使用JSON格式存储(可读性强,便于手动调整)。
实现步骤:
- 调整Bar类结构,让Bar实例持有所有库存项(替代全局变量),实现统一管理。
- 添加库存加载与保存方法,程序启动时从文件读取数据,库存修改后自动写入文件。
示例代码修改:
import json class Bar: def __init__(self, name, stock_file="bar_stock.json") -> None: self.name = name self.stock_file = stock_file self.inventory = {} # 用字典存储库存,键为物品名称 self.load_stock() # 启动时加载库存 def load_stock(self): """从JSON文件加载库存数据""" try: with open(self.stock_file, 'r', encoding='utf-8') as f: stock_data = json.load(f) # 重建Inventory对象 for item_name, data in stock_data.items(): self.inventory[item_name] = Inventory( name=data['name'], stock=data['stock'], brand=data['brand'], cl_price=data['cl_price'], percentage=data['percentage'] ) except FileNotFoundError: # 文件不存在时初始化默认库存 self.init_default_stock() self.save_stock() def save_stock(self): """将库存数据写入JSON文件""" stock_data = {} for item_name, item in self.inventory.items(): stock_data[item_name] = { 'name': item.name, 'stock': item.stock, 'brand': item.brand, 'cl_price': item.cl_price, 'percentage': item.percentage } with open(self.stock_file, 'w', encoding='utf-8') as f: json.dump(stock_data, f, indent=2) def init_default_stock(self): """初始化默认库存项""" self.inventory['Vodka'] = Inventory('Vodka', 79, 'Absolut', '35 kr', '37.5%') self.inventory['Mezcal'] = Inventory('Mezcal', 56, 'Corte Vetusto', '55 kr', '45%') self.inventory['Ardbeg'] = Inventory('Ardbeg', 94, 'Ardbeg', '50 kr', '46%') # 其他默认库存项按需添加 def reduce_stock(self, drink_name): """根据饮品配方调整原料库存""" recipes = { 'Whiskey Sour': [ ('Ardbeg', -5), ('Citrus_Juice', -3), ('Sugar Syrup', +2) ], 'Negroni': [ ('Campari', -2), ('Gin', -2), ('Sweet Vermouth', -2) ] # 其他饮品配方按需添加 } if drink_name in recipes: for item_name, change in recipes[drink_name]: if item_name in self.inventory: self.inventory[item_name].stock += change self.save_stock() # 修改后立即保存 class Inventory: def __init__(self, name, stock, brand, cl_price, percentage) -> None: self.stock = stock self.name = name self.brand = brand self.cl_price = cl_price self.percentage = percentage
问题2:重构后create_stock参数不符预期
问题说明:
实例方法的self参数由Python自动传入,无需手动传递。你感知到的“需要6个参数”是误解——调用时只需传入self之外的5个参数即可。
优化方案:
同时,当前create_stock仅创建对象但未存入Bar的库存,需修改方法将对象保存到Bar实例的属性中:
class Bar: def __init__(self, name) -> None: self.name = name self.inventory = {} # 新增库存存储字典 def create_stock(self, name, stock, brand, cl_price, percentage): """创建库存项并添加到酒吧库存""" self.inventory[name] = Inventory(name, stock, brand, cl_price, percentage) # 调用示例 my_bar = Bar("My Pub") # 仅需传入5个参数,self由Python自动处理 my_bar.create_stock("Vodka", 79, "Absolut", "35 kr", "37.5%")
这样调用时只需传5个参数,符合预期,且创建的库存项会被Bar实例持有,方便后续管理。
内容的提问来源于stack exchange,提问作者Nils Edström
相关产品推荐
相关产品推荐

