Python代码报错:AttributeError: 'Save_user'对象无username属性求助
问题:AttributeError: 'Save_user' object has no attribute 'username'
我在学习《Python Crash Course》时编写了一个小程序,功能是:若存在username.json文件则读取用户名并问候,不存在则创建文件存储用户名。该程序昨日运行正常,但今日启动时报错AttributeError: 'Save_user' object has no attribute 'username'。尝试在__init__方法中设置username为0后,部分编辑器可运行但Visual Studio仍报错。
原代码如下:
import json class Save_user: """Greet the user if the username presents.""" """Ask the name otherwise.""" def __init__(self): """Sets username; Calls greet_user()""" self.file_path = 'username.json' self.greet_user() def get_stored_username(self): """Get the username if stored.""" try: with open(self.file_path) as f: self.username = json.load(f) except FileNotFoundError: return None else: return self.username def greet_user(self): """Choose greet the user or store the username.""" self.get_stored_username() if self.username: self.if_same_user() else: self.store_name() def store_name(self): """Store username.""" self.username = input("Enter your username: ") with open(self.file_path, 'w') as f: json.dump(self.username, f) print("Great! We'll greet you next time!") def if_same_user(self): """Check if the same user.""" print(f"Are you {self.username}?") while True: response = input("Please, Enter 'yes' or 'no': \n") response = response.lower().strip() if response == 'yes' or response == 'y': print(f"Welcome back, {self.username}!") break elif response == 'no' or response == 'n': self.store_name() break useame = Save_user()
报错Traceback:
Traceback (most recent call last): File "c:\Users\Windows 10\Desktop\python_work\New folder\new.py", line 50, in <module> username = Save_user() ^^^^^^^^^^^ File "c:\Users\Windows 10\Desktop\python_work\New folder\new.py", line 10, in __init__ self.greet_user() File "c:\Users\Windows 10\Desktop\python_work\New folder\new.py", line 25, in greet_user if self.username: ^^^^^^^^^^^^^ AttributeError: 'Save_user' object has no attribute 'username'
错误原因
核心问题是对象的username属性未被初始化:
- 当
username.json不存在时,get_stored_username()触发FileNotFoundError,直接返回None,但没有给self.username赋值。 - 后续
greet_user()里执行if self.username时,Save_user对象根本没有username这个属性,因此抛出AttributeError。 - 你之前在
__init__中设置self.username = 0能临时让部分编辑器运行,但0在布尔判断中会被视为False,逻辑上不符合“未找到用户名”的场景,属于治标不治本。
修复方案
最简单的修复方式是在__init__方法中先初始化self.username为None,确保对象始终拥有这个属性;同时可以优化get_stored_username的逻辑,让它更清晰:
修复后的完整代码:
import json class Save_user: """Greet the user if the username presents.""" """Ask the name otherwise.""" def __init__(self): """Initialize attributes and call greet_user()""" self.file_path = 'username.json' self.username = None # 初始化username属性为None self.greet_user() def get_stored_username(self): """Get the username if stored.""" try: with open(self.file_path) as f: return json.load(f) except FileNotFoundError: return None def greet_user(self): """Choose greet the user or store the username.""" self.username = self.get_stored_username() # 直接将返回值赋值给self.username if self.username: self.if_same_user() else: self.store_name() def store_name(self): """Store username.""" self.username = input("Enter your username: ") with open(self.file_path, 'w') as f: json.dump(self.username, f) print("Great! We'll greet you next time!") def if_same_user(self): """Check if the same user.""" print(f"Are you {self.username}?") while True: response = input("Please, Enter 'yes' or 'no': \n") response = response.lower().strip() if response in ('yes', 'y'): print(f"Welcome back, {self.username}!") break elif response in ('no', 'n'): self.store_name() break username = Save_user() # 修正原代码中的拼写错误useame→username
关键修复点
- 在
__init__中添加self.username = None,确保对象始终拥有该属性,避免属性未定义的错误。 - 调整
get_stored_username的逻辑:不再直接给self.username赋值,而是返回读取到的用户名或None,让greet_user统一处理赋值,逻辑更清晰。 - 修正了原代码末尾的拼写错误
useame = Save_user()→username = Save_user()。
内容的提问来源于stack exchange,提问作者Max_CSD Loradon
相关产品推荐
相关产品推荐

