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

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 21:54:08