Python类内方法间变量访问及字典持久化实现思路问询
这在Python类开发里是挺常见的需求,给你几种实用的解决思路:
把方法内变量转为实例属性:这是最常用的方式,就像你代码里对
self.user和self.passw的处理——在方法里把变量赋值给self.变量名,这样这个变量就属于类的实例了,其他方法只要通过self.变量名就能直接访问。比如你在username_input里设置了self.user,那username_creator其实不用再调用一次username_input,直接返回self.user就行(前提是username_input已经被实例调用过)。调用方法获取返回值:如果变量不需要长期保存在实例里,你可以在需要它的方法里直接调用目标方法,拿到返回值来用。比如你代码里
username_creator调用username_input后返回结果,不过更规范的写法是用self.username_input()而不是password.username_input(self),毕竟是实例自己调用方法嘛。使用类属性(适用于共享变量):如果这个变量是类的所有实例都需要共用的,那可以把它定义在类的层级(比如
class password(object):下面直接写shared_data = {}),然后在方法里用self.shared_data或者password.shared_data来访问和修改,这样所有实例都能共享这个变量的值。
你的代码功能没问题,要实现数据持久化,核心就是把内存里的字典数据写到外部存储介质,下次脚本启动时再读回来。这里给你几个常用的实现思路:
JSON文件存储(简单易上手):JSON格式天生适合存储键值对数据,Python自带
json模块,不用额外安装依赖,操作也很直观。- 保存数据:当你完成
my_dict的修改后,用json.dump()把字典写入文件:import json # 保存字典到文件 with open('user_passwords.json', 'w') as f: json.dump(my_dict, f) - 加载数据:脚本启动时,先尝试读取文件内容,如果文件不存在就初始化空字典:
import json try: with open('user_passwords.json', 'r') as f: my_dict = json.load(f) except FileNotFoundError: my_dict = {}
你的
my_dict是字符串键值对,完全符合JSON的存储要求,非常适合用这种方式。- 保存数据:当你完成
SQLite数据库(适合数据量较大或需要查询的场景):如果之后你的用户数据变多,或者需要快速查询、修改记录,SQLite是个不错的选择——Python自带
sqlite3模块,不需要额外搭建数据库服务。- 大致实现思路:
- 脚本启动时连接SQLite数据库(不存在就自动创建),并创建一个存储用户名和密码的表。
- 加载数据时,从数据库表中读取所有记录并转成字典。
- 修改或添加用户时,执行SQL语句更新数据库。
示例代码片段:
import sqlite3 # 连接数据库文件(不存在则创建) conn = sqlite3.connect('user_passwords.db') cursor = conn.cursor() # 创建用户表(如果不存在) cursor.execute('''CREATE TABLE IF NOT EXISTS users (username TEXT PRIMARY KEY, password TEXT NOT NULL)''') # 从数据库加载数据到my_dict my_dict = {} cursor.execute('SELECT username, password FROM users') for username, password in cursor.fetchall(): my_dict[username] = password # 保存新用户或更新用户密码的函数 def save_or_update_user(username, password): # REPLACE会在用户名存在时更新,不存在时插入 cursor.execute('REPLACE INTO users VALUES (?, ?)', (username, password)) conn.commit() # 脚本结束前记得关闭连接 # conn.close()
- 大致实现思路:
Shelve模块(Python对象直接存储):如果你想直接存储Python对象(不止是基本类型),可以用Python自带的
shelve模块,它的用法和字典几乎一样,非常省心。- 保存和加载示例:
import shelve # 保存数据到shelve文件 with shelve.open('user_db') as db: db.update(my_dict) # 从shelve文件加载数据到my_dict with shelve.open('user_db') as db: my_dict = dict(db)
这种方式的优点是能直接存储复杂Python对象,但缺点是只能用Python读取,不适合跨语言场景。
- 保存和加载示例:
内容的提问来源于stack exchange,提问作者ashton

