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

Python登录示例问题:输入用户名被识别为字符串而非User类实例报错

核心问题原因

  • users列表仅存储了用户名字符串,没有存储对应User实例,登录时获取的输入也是字符串,无法访问User类的password、status等属性
  • User类的初始化方法没有存储username、status两个入参,后续无法调用这两个属性
  • 存在多处逻辑错误:密码尝试次数计数加错变量、用户名校验逻辑错误、递归调用存在栈溢出风险等

修复后的完整代码

class User():
    def __init__(self, first_name, last_name, username, password, status=True):
        self.first_name = first_name
        self.last_name = last_name
        self.username = username # 补存用户名属性
        self.password = password
        self.status = status # 补存账户状态属性
        self.name = first_name.title() + " " + last_name.title()              

# 改用字典存用户名到User实例的映射,查询更方便
user_map = {}

def add_user():
    while True:
        new_username = input("Choose a Username: ")    
        if new_username not in user_map:
            break
        print("Username already in use; choose a different username: ")
    
    while True:
        password = input("Choose a 4 character password: ")
        if len(password) == 4:
            break
    
    first_name = input("First name? ")
    last_name = input("Last name? ")

    # 创建User实例存入字典
    user = User(first_name, last_name, new_username, password)
    print("Welcome " + user.name)
    user_map[new_username] = user
    print(f"已注册用户:{list(user_map.keys())}")

    more = input("Add another user? (Y/N) ").lower()
    if more not in ("n", "no"):
        add_user()

def login():
    while True:
        username_entry = input("Username? ")
        if username_entry in user_map:
            # 拿到对应用户实例
            current_user = user_map[username_entry]
            break
        print("用户名不存在,请重新输入")
    
    if not current_user.status:
        print("Account locked")
        return
    
    password_count = 0
    while password_count < 4:
        password_entry = input("Password? ")
        if password_entry == current_user.password:
            print("Login details accepted. Welcome " + current_user.name)
            break
        password_count += 1
        print(f"密码错误,剩余尝试次数:{4 - password_count}")
    else:
        print("Login attempts exceeded.  Contact customer support for assistance.")
        current_user.status = False

    more = input("Login user? (Y/N) ").lower()
    if more not in ("n", "no"):
        login()

add_user()
login() 

主要修改点说明

  • 把存储用户的结构从列表改成字典user_map,key为用户名字符串,value为对应的User实例,登录时可以直接通过用户名拿到实例
  • 补全User类__init__方法中username和status属性的赋值
  • 修正密码尝试次数的计数逻辑,原来错误地给password_entry加1,现在改为给计数变量password_count累加
  • 修正用户输入判断逻辑,原来的more != ("n" or "no")写法错误,改为more not in ("n", "no")
  • 优化提示信息,避免无意义的死循环提示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:48:03