如何累加OOP中所有类实例的属性?储蓄追踪程序咨询
嘿,我来帮你搞定这个总储蓄累加的问题!首先得先指出你代码里一个容易踩坑的点:原来的spent是类变量,所有Saving实例会共享同一个列表,这意味着一个月份的消费会跑到其他月份的记录里去,肯定不是你想要的,所以得先把它改成实例变量self.spent = []。
接下来,针对你要累加每个实例(month.budget + month.to_save_each_month)的需求,给你两种实用的实现方案:
方案一:实时维护总储蓄(类变量跟踪)
这种方式会在创建实例和每次消费时自动更新总储蓄,随时可以直接获取结果:
class Saving(): to_save_each_month = 961.71 total_saved = 0 # 类变量,用来跟踪所有月份的总储蓄累加值 def __init__(self,wage,rent): self.wage = wage self.rent = rent self.spent = [] # 改成实例变量,每个月份自己的消费记录 self.budget = round(self.wage - (self.to_save_each_month + self.rent),2) # 初始化时,把当前月份的初始贡献值加入总储蓄 self.current_value = self.budget + self.to_save_each_month Saving.total_saved += self.current_value def spending(self, spend): # 消费会减少当前月份的budget,所以总储蓄也要相应减去消费金额 Saving.total_saved -= spend self.budget = round(self.budget - spend, 2) self.spent.append(spend)
使用起来很简单,比如:
# 创建1月和2月的实例 jan = Saving(3000, 1200) feb = Saving(3200, 1200) # 1月花了50块 jan.spending(50) # 直接打印总储蓄 print(Saving.total_saved) # 输出结果会自动计算好
方案二:按需计算总储蓄(收集实例后遍历)
如果你不想实时维护总数值,而是希望在需要的时候再计算,这种方式更灵活:
class Saving(): to_save_each_month = 961.71 all_months = [] # 类变量,保存所有创建的Saving实例 def __init__(self,wage,rent): self.wage = wage self.rent = rent self.spent = [] # 实例变量,独立的消费记录 self.budget = round(self.wage - (self.to_save_each_month + self.rent),2) Saving.all_months.append(self) # 把当前实例加入列表 def spending(self, spend): self.budget = round(self.budget - spend, 2) self.spent.append(spend) @classmethod def get_total_saved(cls): # 遍历所有月份实例,计算每个的(budget + to_save_each_month)并累加 total = 0.0 for month in cls.all_months: total += month.budget + month.to_save_each_month return round(total, 2)
使用时,调用类方法就能得到总储蓄:
# 创建实例 mar = Saving(3100, 1200) apr = Saving(3300, 1200) # 调用方法计算总和 print(Saving.get_total_saved())
两种方案怎么选?
- 如果需要随时快速获取总储蓄,选方案一,实时更新更高效;
- 如果实例创建或消费操作不多,或者希望避免实时维护的潜在问题,选方案二更稳妥。
内容的提问来源于stack exchange,提问作者Jperkins98
相关产品推荐
相关产品推荐

