子类设置的折扣无法在父类生效,折扣计算始终走默认分支
问题分析与修复
核心问题
你的代码有两个关键问题导致折扣不生效:
- 父类
Person的__init__方法中,折扣判断用的是传入的参数discount,而不是实例属性self.discount;而且子类调用父类构造方法时没有传递折扣值,默认用了0,所以必然走discount == 0的分支。 - 子类
Privilage是在调用完父类构造方法之后才设置self.discount,但此时父类已经完成了money的计算,新设置的折扣值根本没参与到计算逻辑里。
修复后的代码
class Person(): def __init__(self, item, quantity, money, discount=0): self.discount = discount self.item = item self.quantity = quantity self.money = money if self.money < quantity * 1000: print('Not enough money') else: # 改用实例属性self.discount进行判断和计算 if self.discount == 0: self.money -= self.quantity * 1000 else: self.money -= self.quantity * 1000 * (1 - self.discount) class Privilage(Person): def __init__(self, item, quantity, money, tag): # 先根据tag确定折扣值,再传给父类构造方法 discount = 0 if tag == 'vip': discount = 0.1 elif tag == 'vvip': discount = 0.2 # 把计算好的discount传给父类 super().__init__(item, quantity, money, discount) self.tag = tag
修复说明
- 父类
Person中,将折扣判断和计算的依据从参数discount改为实例属性self.discount,确保折扣值的修改能同步影响计算逻辑。 - 子类
Privilage先根据tag计算出对应的折扣值,再调用父类构造方法时把这个折扣值传进去,让父类初始化时直接用正确的折扣计算money,避免后续修改折扣的滞后性。
这样修改后,VIP/VVIP用户的折扣就能正确应用到金额计算里了。
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

