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

子类设置的折扣无法在父类生效,折扣计算始终走默认分支

问题分析与修复

核心问题

你的代码有两个关键问题导致折扣不生效:

  • 父类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

修复说明

  1. 父类Person中,将折扣判断和计算的依据从参数discount改为实例属性self.discount,确保折扣值的修改能同步影响计算逻辑。
  2. 子类Privilage先根据tag计算出对应的折扣值,再调用父类构造方法时把这个折扣值传进去,让父类初始化时直接用正确的折扣计算money,避免后续修改折扣的滞后性。

这样修改后,VIP/VVIP用户的折扣就能正确应用到金额计算里了。

内容的提问来源于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:50:45