创建存储类实例并按需检索:分数追踪系统AttributeError修复
问题分析与修复方案
错误原因
你遇到的AttributeError本质是两个核心问题:
- 第一个循环中,你往列表里存的是字符串(
"user" + str(i)),而不是实际创建的User对象,导致列表里没有可调用方法的用户实例。 - 第二个循环中,你输入的是用户名字符串,直接用这个字符串调用
getStats方法——字符串本身没有这个属性,自然报错。另外你还漏写了方法调用的括号(getStats应该是getStats())。
修复步骤与代码示例
1. 先完善User类(添加用户名属性)
如果你的User类还没有用户名属性,先补上,方便后续关联和查找:
class User: def __init__(self, username): self.username = username self.total_games = 0 self.total_wins = 0 def getStats(self): # 处理除数为0的情况 win_ratio = self.total_wins / self.total_games if self.total_games > 0 else 0 print(f"用户名: {self.username}, 总游戏数: {self.total_games}, 总获胜数: {self.total_wins}, 胜负比: {win_ratio:.2f}")
2. 修改主逻辑代码
user_list = [] # 不要用list作为变量名,会覆盖Python内置类型 i = 1 cont = "y" while cont.lower() == "y": username = "user" + str(i) # 创建User对象并存入列表,而不是存字符串 new_user = User(username) user_list.append(new_user) # 可选:创建时查看统计 # new_user.getStats() i += 1 cont = input("Continue?: ") # 打印用户列表时显示用户名,而非对象内存地址 print("已创建用户列表:") for user in user_list: print(user.username) while True: selected_name = input("选择要查看的用户: ") # 遍历列表找到对应的User对象 target_user = None for user in user_list: if user.username == selected_name: target_user = user break if target_user: target_user.getStats() # 注意加括号调用方法 else: print(f"用户 {selected_name} 不存在") cont2 = input("继续查看吗?: ") if cont2.lower() != "y": break
关键修改点
- 列表存储的是
User对象而非字符串,保留了实例的方法和属性。 - 通过用户名遍历列表匹配对应的对象,确保调用方法的是用户实例而非字符串。
- 修复了方法调用漏写括号的问题,同时处理了用户不存在的边界情况。
- 避免使用
list作为变量名,防止覆盖Python内置类型。
内容的提问来源于stack exchange,提问作者Kyribur
相关产品推荐
相关产品推荐

