Python OOP中如何访问Menu类内指定饮品的cost属性?
核心问题分析
你当前的写法menu[order][cost]存在两处错误:
- Menu类实例(比如你代码里的
menu)不是字典/序列的直接访问结构,默认无法通过[order]这种方式获取对应的MenuItem实例; - 即使拿到了MenuItem实例,
[cost]是字典的键访问语法,而类实例的属性必须用**点号.**来调用。
正确实现步骤
假设你的Menu和MenuItem类基础结构如下(常见的饮品售卖类结构):
class MenuItem: def __init__(self, name, cost, ingredients): self.name = name self.cost = cost self.ingredients = ingredients class Menu: def __init__(self): self.items = [ MenuItem("latte", 2.5, {"espresso": 1, "milk": 2}), MenuItem("espresso", 1.5, {"espresso": 1}), MenuItem("cappuccino", 3.0, {"espresso": 1, "milk": 1}) ] # 给Menu类加一个根据名称查找饮品的方法 def get_drink(self, order_name): for item in self.items: if item.name == order_name.lower(): return item return None
1. 获取目标MenuItem实例
用户选择饮品后,先通过Menu类的查找方法拿到对应的实例:
# 假设order是用户输入的饮品名称字符串,比如"latte" target_drink = menu.get_drink(order)
2. 正确访问cost属性并传入支付方法
拿到实例后,用点号访问cost属性,再传入make_payment:
if target_drink: mymoney.make_payment(target_drink.cost) else: print("菜单中没有该饮品")
替代方案(无查找方法时)
如果你的Menu类没有专门的查找方法,也可以直接遍历内部的菜单列表:
target_drink = None for item in menu.items: # 注意这里是Menu实例的items列表属性 if item.name == order.lower(): target_drink = item break if target_drink: mymoney.make_payment(target_drink.cost)
内容的提问来源于stack exchange,提问作者Abdou Bonfoh
相关产品推荐
相关产品推荐

