如何为菜单选项绑定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
相关产品推荐
相关产品推荐

