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

酒吧程序中如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 14:01:00