酒吧程序中如何在Bartender类中访问并修改Liquor类库存?
解决酒吧程序中调酒师扣减原料库存的问题
核心问题分析
你的代码目前存在两个关键问题:
- Liquor类的
instances列表存储的是酒品名称字符串,而非实例对象,导致无法通过名称关联到对应的库存属性 Bartender类的make_drink方法缺少饮品与原料的关联逻辑,也没有找到对应Liquor实例进行库存扣减的机制
具体解决步骤
1. 修正Liquor类的实例存储逻辑
将instances列表存储实例对象而非名称,同时新增通过名称查找实例的方法,方便后续调用:
class Liquor(Item): # 存储实例对象而非名称 instances = [] def __init__(self, name, stock, brand, cl_price, percentage) -> None: super().__init__(stock, name) self.cl_price = cl_price self.percentage = percentage self.brand = brand # 添加实例本身到列表 self.__class__.instances.append(self) # 类方法:返回所有酒品名称,用于菜单展示 @classmethod def liquor_list(cls): return '\n'.join([liquor.name for liquor in cls.instances]) # 类方法:通过名称查找对应酒品实例 @classmethod def get_liquor_by_name(cls, name): for liquor in cls.instances: if liquor.name == name: return liquor return None # 酒品实例创建保持不变 Vodka = Liquor('Vodka', 79, 'Absolut', '35 kr', '37.5%') Mezcal = Liquor('Mezcal', 56, 'Corte Vetusto', '55 kr', '45%') Whiskey = Liquor('Ardbeg', 94, 'Ardbeg', '50 kr', '46%',) Rum = Liquor('Rum', 109, 'Havana Club', '25 kr', '37.5%') Baileys = Liquor('Baileys', 43, 'Baileys', '20 kr', '17%')
2. 定义饮品配方映射
在主模块中添加配方字典,明确每种饮品需要的原料及分量:
# 示例配方:键为饮品名称,值为(原料名称, 所需分量)的列表 DRINK_RECIPES = { 'Vodka Soda': [('Vodka', 5)], # 一杯伏特加苏打需要5cl伏特加 'Whiskey Sour': [('Ardbeg', 4), ('Baileys', 1)] # 示例复合饮品配方 }
3. 修改Bartender类的核心方法
更新make_drink方法,实现库存检查与扣减逻辑,同时修正buy_more方法的错误:
class Bartender(Person): def __init__(self, name, age, speciality) -> None: super().__init__(name, age) self.speciality = speciality def make_drink(self, drink, this_waiter): # 检查饮品是否有对应配方 if drink not in DRINK_RECIPES: print(f"抱歉,暂无{drink}的制作配方") return # 遍历配方,检查库存并扣减 can_make = True for liquor_name, required_cl in DRINK_RECIPES[drink]: liquor = Bar_Back.Liquor.get_liquor_by_name(liquor_name) if not liquor: print(f"原料{liquor_name}不存在") can_make = False break if liquor.stock < required_cl: print(f"原料{liquor_name}库存不足:剩余{liquor.stock}cl,需要{required_cl}cl") can_make = False break # 执行库存扣减 liquor.stock -= required_cl print(f"{liquor_name}库存更新:{liquor.stock + required_cl}cl → {liquor.stock}cl") # 若所有原料满足条件,完成出餐流程 if can_make: this_waiter.remove_order(drink) this_waiter.serve(drink) # 修正补库存方法,通过名称定位实例 def buy_more(self, liquor_name): liquor = Bar_Back.Liquor.get_liquor_by_name(liquor_name) if liquor: liquor.stock += 100 print(f"{liquor.name}新库存:{liquor.stock}cl") else: print(f"未找到酒品{liquor_name}")
验证效果
调用make_drink('Vodka Soda', waiter_instance)时,系统会自动找到Vodka实例,将其库存从79cl扣减至74cl,并完成后续的订单移除与出餐操作。
内容的提问来源于stack exchange,提问作者Nils Edström
相关产品推荐
相关产品推荐

