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

在Python中,能否向类中的方法直接传入列表作为参数?

问题解决:直接传入列表调用Menu.calculate_bill方法

你的代码存在三个关键问题,导致无法实现预期功能:

  • 调用方式错误:calculate_bill是实例方法,必须通过具体的Menu实例(比如brunch、dinner)调用,而非直接用类Menu调用。直接用类调用会缺少self参数,引发报错。
  • 价格取值错误:方法里self.name[item][0]的写法完全错误——self.name是菜单名称字符串,不是存储菜品价格的字典。正确取值应为self.items[item],self.items才是对应菜品与价格的映射字典。
  • 可变默认参数陷阱:用purchased_items = []作为默认参数,会导致多次调用方法时复用同一个列表,引发意外行为。正确做法是将默认值设为None,再在方法内部初始化空列表。

修正后的完整代码如下:

class Menu:
    def __init__(self, name, items, start_time, end_time):
        self.name = name
        self.items = items
        self.start_time = start_time
        self.end_time = end_time
    
    def __repr__(self):
        return f"{self.name} menu available from {self.start_time} o'clock to {self.end_time} o'clock"

    def calculate_bill(self, purchased_items=None):
        # 处理默认参数,避免可变默认参数陷阱
        if purchased_items is None:
            purchased_items = []
        total_price = 0.0
        for item in purchased_items:
            # 从self.items字典中获取菜品价格
            total_price += self.items[item]
        return total_price

# 创建菜单实例
brunch = Menu('brunch', {'pancakes': 7.50, 'waffles': 9.00, 'burger': 11.00, 'home fries': 4.50, 'coffee': 1.50, 'espresso': 3.00, 'tea': 1.00, 'mimosa': 10.50, 'orange juice': 3.50}, 11, 16)

early_bird = Menu('early-bird', {'salumeria plate': 8.00, 'salad and breadsticks (serves 2, no refills)': 14.00, 'pizza with quattro formaggi': 9.00, 'duck ragu': 17.50, 'mushroom ravioli (vegan)': 13.50, 'coffee': 1.50, 'espresso': 3.00}, 15, 18)

dinner = Menu('dinner', {'crostini with eggplant caponata': 13.00, 'caesar salad': 16.00, 'pizza with quattro formaggi': 11.00, 'duck ragu': 19.50, 'mushroom ravioli (vegan)': 13.50, 'coffee': 2.00, 'espresso': 3.00}, 17, 23)

kids = Menu('kids', {'chicken nuggets': 6.50, 'fusilli with wild mushrooms': 12.00, 'apple juice': 3.00}, 11, 21)

# 直接传入列表调用实例方法,实现预期功能
print(brunch.calculate_bill(['pancakes', 'home fries', 'coffee']))  # 输出:13.5

现在你可以直接传入列表给具体菜单实例的calculate_bill方法,无需提前将列表赋值给变量,代码简洁且符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 15:33:34