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

Python中如何更新类实例的self变量?实例变量无法更新的问题

理解实例变量更新与动态内容显示问题

嘿,我来帮你搞定这个困惑!首先咱们先理清楚你遇到的核心问题,再区分清楚类变量和实例变量的区别。

问题出在哪?

你在ScoreBoard的__init__方法里创建了self.sheet,它是一个包含格式化字符串的列表。但这里的f-string是在实例初始化时就已经把当时的self.a到self.d的值(也就是下划线)代入生成了固定字符串。之后你在Engine的play_game里修改self.board.a这些变量时,self.sheet里的字符串并不会自动更新——因为它只是初始化时的一个“快照”,和后续的变量变化没有关联了。

类变量 vs 实例变量

先帮你理清这两个概念:

  • 实例变量:就是你用self.xxx定义的变量,每个类的实例(比如你的new_board)都有自己独有的一套,互不干扰。你的self.a、self.b、self.sheet都是实例变量,这部分你其实用对了。
  • 类变量:是直接定义在类里面、所有方法外面的变量,比如如果写class ScoreBoard: a = "_____",那这个a就是类变量,所有ScoreBoard的实例都会共享它的值(除非实例自己重新定义了同名的实例变量覆盖它)。你的代码里没有用到类变量,所以不用太担心这部分混淆。

怎么解决让sheet显示最新值?

最优雅的方式是把sheet改成一个动态属性,每次访问它的时候才生成最新的字符串。这样不管你什么时候修改self.a到self.d,打印sheet时都会用当前的最新值。

修改后的代码如下:

class Engine(object):
    def __init__(self, board):
        self.board = board
    def play_game(self):
        print(self.board.sheet[0])
        number_one = int(input("Please enter a number."))
        self.board.a = number_one
        number_two = int(input("Please enter another number."))
        self.board.b = number_two
        number_three = int(input("Please enter a third number."))
        self.board.c = number_three
        number_four = int(input("Please enter a final number."))
        self.board.d = number_four
        print("Thank you! List updated.")
        print(self.board.sheet[0])

class ScoreBoard(object):
    def __init__(self):
        self.a = "_____"
        self.b = "_____"
        self.c = "_____"
        self.d = "_____"
    
    # 把sheet改成@property,每次访问时动态生成
    @property
    def sheet(self):
        return [f""" 1. Number One: {self.a}
 2. Number Two: {self.b}
 3. Number Three: {self.c}
 4. Number Four: {self.d} """]

new_board = ScoreBoard()
new_game = Engine(new_board)
new_game.play_game()

另一种可选方法:手动更新sheet

如果你不想用@property,也可以在ScoreBoard里写一个更新sheet的方法,每次修改a-d之后调用它:

class ScoreBoard(object):
    def __init__(self):
        self.a = "_____"
        self.b = "_____"
        self.c = "_____"
        self.d = "_____"
        self.update_sheet()
    
    def update_sheet(self):
        self.sheet = [f""" 1. Number One: {self.a}
 2. Number Two: {self.b}
 3. Number Three: {self.c}
 4. Number Four: {self.d} """]

然后在Engine的play_game里,每次赋值后加上self.board.update_sheet(),比如:

self.board.a = number_one
self.board.update_sheet()
# 其他变量同理

这样运行代码后,你输入的数字就会正确显示在sheet里啦!

内容的提问来源于stack exchange,提问作者Andrew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:26:49