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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:35:17