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

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

关键修复点

  1. 在__init__中添加self.username = None,确保对象始终拥有该属性,避免属性未定义的错误。
  2. 调整get_stored_username的逻辑:不再直接给self.username赋值,而是返回读取到的用户名或None,让greet_user统一处理赋值,逻辑更清晰。
  3. 修正了原代码末尾的拼写错误useame = Save_user()→username = Save_user()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:55:30