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

如何为菜单选项绑定sellProduct方法?代码问题排查与优化

糖果机代码错误排查与优化建议

问题说明

无法将processSale方法与sellProduct方法关联,不清楚如何为菜单1-4选项应用sellProduct方法,对类属性的调用逻辑存在困惑,已遵循给定规范但代码运行异常,需要排查错误并获取优化建议。

关键错误排查

  • 方法调用遗漏括号:多处方法调用未加括号,导致调用的是方法对象而非执行方法逻辑,例如:
    • self.showMenu 应改为 self.showMenu()
    • self.useDispenser.getCount 应改为 self.useDispenser.getCount()
    • self.useDispenser.getProductCost 应改为 self.useDispenser.getProductCost()
    • self.useDispenser.makeSale 应改为 self.useDispenser.makeSale()
    • Register.currentBalance 应改为 Register.currentBalance()
  • 全局变量滥用:showMenu使用全局变量userInput传递选择,导致processSale中无法正确获取输入,且全局变量易引发不可预期的副作用。
  • 默认参数初始化问题:sellProduct方法的默认参数useDispenser = Dispenser(), useRegister = CashRegister()在函数定义时就已创建实例,多次调用会复用同一个实例,不符合业务逻辑。
  • 未启动核心流程:代码最后仅调用了showMenu(),未启动processSale()循环,导致菜单仅显示一次就终止。
  • 条件判断逻辑错误:sellProduct中先判断getCount !=0,但未执行方法调用,且分支顺序可以优化,应先检查商品是否售罄。

优化建议

  • 移除全局变量:修改showMenu使其返回用户输入值,避免全局变量的副作用。
  • 区分商品属性:初始化不同商品时设置不同的成本和数量,体现商品差异(例如糖果50分,薯片60分等)。
  • 简化菜单选择逻辑:将商品实例存储在字典中,通过菜单数字直接映射到对应商品,减少重复的elif代码。
  • 优化默认参数:将sellProduct的默认参数设为None,在方法内部按需创建实例,避免复用同一个实例。
  • 增强输入验证:在showMenu中添加非数字输入的处理,确保用户输入合法。

修正后的完整代码

# candy machine
class CashRegister:
    def __init__(self, cashOnHand=500):
        self.cashOnHand = cashOnHand if cashOnHand >= 0 else 500

    def currentBalance(self):
        return self.cashOnHand

    def acceptAmount(self, cashIn):
        self.cashOnHand += cashIn

class Dispenser:
    def __init__(self, numberOfItems=50, productCost=50):
        self.numberOfItems = numberOfItems if numberOfItems >= 0 else 50
        self.productCost = productCost if productCost >= 0 else 50
    
    def getCount(self):
        return self.numberOfItems

    def getProductCost(self):
        return self.productCost

    def makeSale(self):
        self.numberOfItems -= 1

class MainProgram:
    def showMenu(self):
        print("**** Welcome to Eros' Candy Shop ****")
        print("To select an item enter")
        print("""1 for Candy
2 for Chips
3 for Gum
4 for Cookies
0 to View Balance
9 to Exit""")
        while True:
            try:
                user_input = int(input("Enter your choice: "))
                return user_input
            except ValueError:
                print("Invalid input! Please enter a number from the menu.")

    def sellProduct(self, useDispenser=None, useRegister=None):
        # 处理默认参数,避免复用同一实例
        dispenser = useDispenser if useDispenser else Dispenser()
        register = useRegister if useRegister else CashRegister()

        if dispenser.getCount() == 0:
            print("The product you chose is sold out! Try other items.")
            return
        
        cost = dispenser.getProductCost()
        print(f"It costs {cost} cents")
        try:
            cash = int(input("Please enter your payment: "))
            if cash < cost:
                print(f"Insufficient money! You need {cost - cash} cents more.")
                return
            change = cash - cost
            print(f"Your change is {change} cents")
            register.acceptAmount(cost)
            dispenser.makeSale()
        except ValueError:
            print("Invalid payment! Please enter a numeric value.")

    def processSale(self):
        # 初始化不同商品的属性
        register = CashRegister()
        products = {
            1: Dispenser(productCost=50, numberOfItems=30),  # Candy
            2: Dispenser(productCost=60, numberOfItems=25),  # Chips
            3: Dispenser(productCost=30, numberOfItems=40),  # Gum
            4: Dispenser(productCost=70, numberOfItems=20)   # Cookies
        }

        while True:
            user_choice = self.showMenu()
            if user_choice in products:
                self.sellProduct(products[user_choice], register)
            elif user_choice == 0:
                print(f"Current Balance is {register.currentBalance()} cents")
            elif user_choice == 9:
                print("Thank you for visiting!")
                break
            else:
                print("Invalid choice! Please select an option from the menu.")

# 启动核心流程
mainProgram = MainProgram()
mainProgram.processSale()

内容的提问来源于stack exchange,提问作者God Hand

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:20:32