Python类中i更新后rank未同步变化的问题求助
问题:修改实例的i属性后,rank属性未同步更新
我在代码里碰到个问题,想搞明白原因并找到解决办法。我原本以为修改i的值后,rank会跟着变,但实际不是这么回事。
原代码
import math class User: ranks = [-8,-7,-6,-5,-4,-3,-2,-1,1,2,3,4,5,6,7,8] i = 0 rank = ranks[i] progress = 0 def inc_progress(self, task_rank): if task_rank == self.rank: self.progress += 3 if self.progress >= 100: self.i += math.floor(self.progress/100) self.progress = self.progress - math.floor(self.progress/100)*100 elif task_rank == self.rank-1: self.progress += 1 if self.progress >= 100: self.i += math.floor(self.progress/100) self.progress = self.progress - math.floor(self.progress/100)*100 elif task_rank <= self.rank - 2: self.progress += 0 else: print(True) self.progress += 10 * ((task_rank - self.rank)**2) if self.progress >= 100: print(True) self.i += math.floor(self.progress/100) print(math.floor(self.progress/100)) self.progress = self.progress - math.floor(self.progress/100)*100
测试情况
user = User() user.inc_progress(-4) print(user.progress) # ==> 返回60,符合预期 print(user.rank) # ==> 返回-8,但i已变为1,rank应变为-7 print(user.i) # ==> 返回1,符合预期
问题原因
你把rank、i、progress定义成了类属性,而非实例属性。类属性只会在类定义阶段初始化一次——也就是rank = ranks[i]只会在类加载时执行一次,把rank固定为ranks[0](即-8)。后续哪怕修改了实例的self.i,rank也不会重新计算,因为它没有和实例的i建立动态关联。
解决办法
把属性移到__init__方法中转为实例属性,同时将rank设为动态计算的属性(用@property装饰器),这样每次访问rank都会根据当前的self.i取值:
import math class User: ranks = [-8,-7,-6,-5,-4,-3,-2,-1,1,2,3,4,5,6,7,8] def __init__(self): self.i = 0 self.progress = 0 @property def rank(self): return self.ranks[self.i] def inc_progress(self, task_rank): current_rank = self.rank # 根据任务等级计算进度 if task_rank == current_rank: self.progress += 3 elif task_rank == current_rank - 1: self.progress += 1 elif task_rank <= current_rank - 2: pass # 进度不变,无需操作 else: self.progress += 10 * ((task_rank - current_rank)**2) # 统一处理升级逻辑,避免重复代码 if self.progress >= 100: level_up = math.floor(self.progress / 100) self.i += level_up # 防止等级超过最高级8 self.i = min(self.i, len(self.ranks)-1) self.progress %= 100
修改后测试
user = User() user.inc_progress(-4) print(user.progress) # 输出60,符合预期 print(user.rank) # 输出-7,正确同步i的变化 print(user.i) # 输出1,符合预期
内容的提问来源于stack exchange,提问作者S.K.
相关产品推荐
相关产品推荐

