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
相关产品推荐
相关产品推荐

