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

酒吧库存程序:库存修改不持久及代码重构参数问题

酒吧程序开发问题解决方案

问题1:库存修改无法持久化

当前库存仅保存在内存中,程序重启后会重置为初始值。解决思路是将库存数据持久化到文件,推荐使用JSON格式存储(可读性强,便于手动调整)。

实现步骤:

  1. 调整Bar类结构,让Bar实例持有所有库存项(替代全局变量),实现统一管理。
  2. 添加库存加载与保存方法,程序启动时从文件读取数据,库存修改后自动写入文件。

示例代码修改:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:30:49