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

Python类方法中self.budget属性调用报错问题求助

问题修复方案

错误根源

  • 属性初始化顺序颠倒:__init__方法里先调用self.buy(),但此时self.budget、self.gifts等实例属性还未定义,触发属性不存在的错误。
  • 参数与变量名混乱:buy方法参数写成quantit,但内部用的是quantity;方法里直接用budget而非self.budget,未正确引用实例属性。
  • 重复赋值与逻辑冗余:__init__里先把self.gifts设为传入的列表,随后又重置为空列表,导致初始礼品丢失;且初始化逻辑和buy方法重复,没必要重复编写。
  • 调用方法名错误:示例里调用enlist,但类中定义的是buy,属于笔误。

修复后的代码

class Shopper():
    def __init__(self, gifts, quantity, budget):
        # 先初始化所有实例属性,再执行购买操作
        self.budget = budget
        self.quantity = 0
        self.gifts = []  # 初始化空列表存储已购礼品
        # 调用buy处理初始购买需求
        self.buy(gifts, quantity)

    # 购买礼品的方法,修正参数与变量引用
    def buy(self, gift_list, quantity):  
        total_cost = quantity * 100
        if self.budget < total_cost:
            print("Insufficient budget")
        else:
            self.gifts.extend(gift_list)
            self.quantity += quantity
            self.budget -= total_cost

# 正确调用示例
Shopper1 = Shopper(['Toys', 'Clothes', 'Foods'], 10, 5000)
Shopper1.buy(["book"], 1)  # 单礼品需传入列表,适配extend方法

# 验证结果
print("已购礼品:", Shopper1.gifts)
print("剩余预算:", Shopper1.budget)
print("总数量:", Shopper1.quantity)

关键修改说明

  • 调整__init__内的代码顺序:先定义所有实例属性,再调用buy方法,确保方法调用时属性已存在。
  • 修正buy方法的参数名与变量引用,统一使用self.xxx访问实例属性,避免未定义变量错误。
  • 移除__init__里重复的购买逻辑,直接复用buy方法,保持代码简洁一致。
  • 修正调用示例中的方法名,并确保传入的礼品为列表格式(适配extend方法的要求)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:31:03