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

