Python多继承场景下重写process_sale方法后rewards输出为0的问题排查
问题排查:process_sale重写后rewards仍为0的原因及修复方案
我帮你梳理下代码里的问题,最可能导致rewards输出为0的原因有两个,先来逐一解决:
1. 最核心的问题:方法缩进错误
你的PlatinumClient子类中的process_sale方法很可能没有正确缩进,导致它不属于子类的成员方法。如果方法的缩进和类定义处于同一层级,那么调用platinum.process_sale(100)时,会默认执行父类CardHolder的process_sale逻辑——只会更新balance,完全不会触发rewards的累加,所以rewards会一直保持初始值0。
2. 次要问题:未调用父类方法更新balance
即使缩进正确,你当前的process_sale只处理了rewards,没有调用父类的process_sale方法,这会导致balance的输出不符合预期(比如调用process_sale(100)后balance还是0,而不是要求的100)。
修复后的完整代码
下面是调整后的代码,解决了上述两个问题:
class Person: def __init__(self, name, address): self.name = name self.address = address def get_info(self): return f"{self.name} lives at {self.address}." class CardHolder: def __init__(self, account_number): self.account_number = account_number self.balance = 0 self.credit_limit = 5000 def process_sale(self, price): self.balance += price def make_payment(self, amount): self.balance -= amount # 子类定义 class PlatinumClient(Person, CardHolder): def __init__(self, name, address, account_number): super().__init__(name, address) super(Person, self).__init__(account_number) self.cash_back = 0.02 self.rewards = 0 # 注意这里的缩进:必须和__init__方法保持同一层级,属于PlatinumClient类 def process_sale(self, price): # 先调用父类的process_sale,更新balance super().process_sale(price) # 用self.cash_back代替硬编码的0.02,代码更易维护 self.rewards += price * self.cash_back # 如果需要整数类型的奖励,可以改成: # self.rewards += int(price * self.cash_back) platinum = PlatinumClient("Sarah", "101 Main Street", 123364) # 执行测试 platinum.process_sale(100) print(platinum.rewards) # 输出2.0(或2,取决于是否用int转换) print(platinum.balance) # 输出100 platinum.make_payment(50) print(platinum.balance) # 输出50 print(platinum.get_info()) # 输出Sarah lives at 101 Main Street.
关键修复点说明
- 缩进修正:确保
process_sale方法的缩进和子类内的其他方法(比如__init__)一致,这样它才会被识别为子类的成员方法,调用时才会执行你的奖励累加逻辑。 - 父类方法调用:添加
super().process_sale(price),确保父类的balance更新逻辑被执行,满足题目对balance输出的要求。 - 代码灵活性:用
self.cash_back代替硬编码的0.02,后续如果需要调整返现比例,只需要修改cash_back的初始值即可,不用改业务逻辑代码。
如果修复后还是出现rewards为0的情况,记得检查是否保存了修改后的代码再运行,以及是否正确调用了platinum.process_sale(100)哦。
内容的提问来源于stack exchange,提问作者Renzm.6958
相关产品推荐
相关产品推荐

