Python继承实现电商每三次购物返50功能的代码问题排查
问题排查与修正
核心问题
你的ShopCashBack子类中,满足第三次购物返现条件时,仅计算了返现后的余额并打印,但未实际将50返现添加到账户余额中。代码里的result = self.getBalance() + 50; print(result)只是输出了一个临时计算值,账户的真实余额并未改变,导致后续打印getBalance()时输出的是扣完购物款后的原始余额(1104),和之前打印的临时值(1154)重复,与期望结果不符。
修正后的代码
父类Shop(无需修改)
class Shop: def __init__(self): self.__balance = 0 def getBalance(self): return self.__balance def loadWallet(self, amount): self.__balance += amount def purchase(self, amount_val): if amount_val <= self.__balance: self.__balance -= amount_val else: print("Insufficient Funds")
子类ShopCashBack(修改返现逻辑)
class ShopCashBack(Shop): def __init__(self, base_val=0): self.__numpurchase = base_val super().__init__() # 用super()调用父类构造更规范,替代Shop.__init__(self) def getPurch(self): return self.__numpurchase def purchase(self, amount_val): self.__numpurchase += 1 # 先执行父类的扣款逻辑 super().purchase(amount_val) # 同样用super()调用父类方法 # 满足返现条件时,实际添加50到余额 if self.__numpurchase % 3 == 0: self.loadWallet(50) # 调用父类的loadWallet修改余额
测试验证
运行你的测试代码:
user = ShopCashBack() user.loadWallet(5000) user.purchase(299) print(user.getBalance()) user.loadWallet(3000) print(user.getBalance()) user.purchase(4990) print(user.getBalance()) user.purchase(1607) print(user.getBalance())
输出结果将与期望一致:
4701 7701 2711 1154
补充说明
- 使用
super()替代直接调用父类名的方式,能让代码更易维护(比如父类名变更时无需修改子类)。 - 返现逻辑通过调用父类的
loadWallet(50)实现,遵循了父类封装的余额修改规则,避免直接操作私有属性__balance。
内容的提问来源于stack exchange,提问作者KushKage
相关产品推荐
相关产品推荐

