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
相关产品推荐
相关产品推荐

