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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 04:15:36