如何在Python字典中存储对象?密码管理器OOP开发疑问
问题分析与解决方案
1. bound method输出的原因
你直接打印user_logins['dave'].return_pass时,是在引用方法对象本身,而非调用方法。调用方法需要加括号,比如user_logins['dave'].return_pass(任意参数)——不过你的return_pass方法其实不需要参数,因为它直接返回实例的self.password,可以修改该方法去掉多余参数。
2. User类的问题修正
你的User类存在几个不符合Python OOP规范的问题:
__str__是Python特殊方法,默认只接受self参数,不能额外添加;return_pass、get_creds、passGen方法中的部分参数是冗余的,无需传入;- 初始化时
password_dict参数未被使用,应处理传入的默认值。
3. 完整实现示例
以下是修正后包含登录验证功能的代码:
import secrets import string class User: def __init__(self, username, password, password_coll=None) -> None: self.username = username self.password = password # 处理传入的密码集合,默认为空字典 self.password_coll = password_coll if password_coll is not None else {} def get_password(self): # 简化获取密码的方法,无需额外参数 return self.password def __str__(self) -> str: # 正确的__str__方法,返回用户标识信息(注意不要明文返回密码) return f"User: {self.username}" def get_creds(self): # 移除多余参数,通过输入更新实例属性 usern = input('Enter username: ') pwd = input('Enter password: ') self.username = usern self.password = pwd def generate_password(self): # 移除多余参数,直接操作实例的password_coll n = int(input('Define password length. Longer passwords are safer.')) source = string.ascii_letters + string.digits password = ''.join(secrets.choice(source) for _ in range(n)) print('Password has been generated!') yon = input('Would you like to save this password? Type y or n: ') if yon.lower() == 'y': site = input('Please enter the site this password is for:') self.password_coll[site] = password return password # 模拟用户存储字典:键为用户名,值为对应User实例 user_database = { 'dave': User('dave', 'pass123', {'github': 'gh_abc123', 'gmail': 'gm_xyz789'}), 'alice': User('alice', 'alicepass', {'twitter': 'tw_456def'}) } def login(): # 登录验证核心逻辑 username_input = input('Enter your username: ') password_input = input('Enter your password: ') # 检查用户名是否存在 if username_input in user_database: user = user_database[username_input] # 验证密码 if user.get_password() == password_input: print(f"登录成功!欢迎{user.username}") # 登录成功后可访问User对象的所有属性 print("你的网站密码列表:") for site, pwd in user.password_coll.items(): print(f"{site}: {pwd}") return user else: print("密码错误!") else: print("用户名不存在!") return None # 测试登录功能 logged_in_user = login()
4. 关键要点说明
- 用户存储设计:
user_database字典完全符合你“用户名作为键,User对象作为值”的需求; - 登录验证流程:先校验用户名存在性,再对比密码,逻辑清晰;
- OOP规范优化:修正了特殊方法定义,移除冗余参数,让代码更贴合Python面向对象编程的习惯;
- 密码管理核心:生成的密码直接存入当前用户的
password_coll字典,实现了网站密码的存储功能。
内容的提问来源于stack exchange,提问作者edwardiano
相关产品推荐
相关产品推荐

