如何在Python程序多次运行间持久化Item类实例的属性数据?
Python中实现Item实例的持久化方案
首先先修正你的Item类里的几个错误:
- 所有比较方法里的
self.otherItem应该改为otherItem,比如self.item_name < otherItem.item_name - 最后一个方法名写错了,应该是
__eq__而不是__eg__
修正后的Item类:
class Item: def __init__(self, item_name, item_definition): self.item_name = item_name self.item_definition = item_definition self.item_level = 0 self.date_to_review = 0 # 后续可以用时间戳实现小时级别的复习计时,初始设置为4小时后 def __lt__(self, otherItem): return self.item_name < otherItem.item_name def __gt__(self, otherItem): return self.item_name > otherItem.item_name def __le__(self, otherItem): return self.item_name <= otherItem.item_name def __ge__(self, otherItem): return self.item_name >= otherItem.item_name def __ne__(self, otherItem): return self.item_name != otherItem.item_name def __eq__(self, otherItem): return self.item_name == otherItem.item_name
下面给出两种适配Python tkinter开发的持久化方案,逻辑和Java的对象流类似:
方案一:用pickle直接序列化对象(最贴近Java对象流逻辑)
pickle是Python内置的序列化模块,可以直接把Item实例整个保存到文件,重启后完整恢复。
1. 保存所有Item实例到文件
import pickle def save_items(items, filename="word_items.pkl"): with open(filename, "wb") as f: pickle.dump(items, f)
调用示例:比如你有一个存Item实例的列表word_list = [Item("apple", "苹果"), Item("banana", "香蕉")],执行save_items(word_list)就能把整个列表保存到本地文件。
2. 从文件加载Item实例
def load_items(filename="word_items.pkl"): try: with open(filename, "rb") as f: return pickle.load(f) except FileNotFoundError: # 文件不存在时返回空列表,相当于首次启动 return []
程序启动时执行word_list = load_items(),就能恢复之前保存的所有Item实例,包括等级、复习时间这些属性。
注意点
- pickle是Python专属格式,不能跨语言读取,但完全满足你的tkinter开发需求
- 保存和加载时,Item类的定义要一致(比如类名、属性名不能随便改),否则可能加载失败
方案二:用shelve按单词名快速存取
如果需要按单词名称快速查找、修改,shelve更合适,它相当于一个持久化的字典:
保存Item实例
import shelve def save_items_shelve(items, filename="word_shelf.db"): with shelve.open(filename, "c") as shelf: for item in items: shelf[item.item_name] = item
加载Item实例
def load_items_shelve(filename="word_shelf.db"): items = [] try: with shelve.open(filename, "r") as shelf: for item in shelf.values(): items.append(item) return items except FileNotFoundError: return []
结合tkinter的使用方式
在tkinter程序里,你只需要:
- 启动程序时调用加载函数,把Item实例加载到内存
- 用户操作(添加、修改单词)时直接操作内存里的实例
- 程序关闭前(绑定窗口关闭事件)调用保存函数,把当前数据写入文件
示例代码片段:
import tkinter as tk root = tk.Tk() # 启动时加载已保存的单词 word_list = load_items() # --- 这里写你的tkinter界面逻辑,比如添加单词、显示复习列表等 --- # 绑定窗口关闭事件,确保退出前保存数据 def on_closing(): save_items(word_list) root.destroy() root.protocol("WM_DELETE_WINDOW", on_closing) root.mainloop()
内容的提问来源于stack exchange,提问作者Seco01
相关产品推荐
相关产品推荐

