Python Qt4环境下多对象创建、存储与持久化技术问询
问题解答:保存多个Python对象并持久化到文件
一、你的判断是对的:旧对象确实会被销毁
每次执行self.mod = YamlPrepr(self.module_name.displayText())时,之前存在self.mod里的对象会失去所有引用(除非你之前把它存在别的地方),Python的垃圾回收机制会自动把它销毁。所以要保留多个对象,不能只靠单个变量存储。
二、核心解决方案:用列表存储所有对象实例
你现在的self.objects列表只存了对象的名称字符串,这完全不够——应该把整个YamlPrepr对象添加进去。修改你的add_yaml方法如下:
def add_yaml(self): # 创建新的YamlPrepr对象 new_mod = YamlPrepr(self.module_name.displayText()) new_mod.modulepak(self.job_box.currentText(), self.option_line.displayText()) if self.param_check.isChecked(): new_mod.parameter(self.param_box.currentText(), self.choice_line.displayText()) # 将完整对象存入列表,而不是只存名称 self.objects.append(new_mod) # 显示当前对象的内容 self.display_line(new_mod.__repr__())
这样每次创建的对象都会被保存在self.objects列表里,只要这个列表没有被清空,所有对象都会保持"存活"状态,你随时可以调用它们的modulepak或parameter方法修改属性。
三、如何修改已存在的对象?
如果需要修改某个已创建的对象,比如修改mariadb的参数,可以给YamlGenerator类加一个根据名称查找对象的方法:
def get_mod_by_name(self, target_name): # 遍历列表找对应名称的对象 for mod in self.objects: if mod.name == target_name: return mod return None # 如果没找到返回None
使用起来很简单:
# 找到名称为"mariadb"的对象 mariadb_mod = self.get_mod_by_name("mariadb") if mariadb_mod: # 修改它的参数 mariadb_mod.parameter("update", "true") # 或者修改模块配置 mariadb_mod.modulepak("apt", "force")
四、将对象保存到文件
1. 保存为TXT/YAML格式(和界面显示一致)
直接遍历self.objects,把每个对象的__repr__()输出写入文件即可:
def save_temporary_to_file(self): # 用w模式覆盖写入,a模式则是追加 with open("output.yaml", "w", encoding="utf-8") as f: for mod in self.objects: f.write(mod.__repr__() + "\n\n") # 每个对象之间加空行分隔
2. 保存为JSON格式(便于后续解析和恢复)
JSON不能直接序列化Python对象,所以我们给YamlPrepr类加一个转字典的方法:
class YamlPrepr: # 保留你原有的__init__、__repr__、modulepak、parameter方法 def to_dict(self): # 将对象属性转成字典 return { "name": self.name, "module": self.module, "module_opt": self.module_opt, "condition": self.condition, "param": self.param, "param_opt": self.param_opt }
然后写保存JSON的方法:
import json def save_to_json(self): # 将所有对象转成字典列表 mod_list = [mod.to_dict() for mod in self.objects] with open("output.json", "w", encoding="utf-8") as f: json.dump(mod_list, f, indent=4, ensure_ascii=False)
如果之后需要从JSON文件恢复对象,可以再加一个加载方法:
def load_from_json(self, file_path): with open(file_path, "r", encoding="utf-8") as f: mod_dicts = json.load(f) # 清空现有对象列表,重新创建对象 self.objects.clear() for mod_dict in mod_dicts: new_mod = YamlPrepr(mod_dict["name"]) new_mod.module = mod_dict["module"] new_mod.module_opt = mod_dict["module_opt"] new_mod.condition = mod_dict["condition"] new_mod.param = mod_dict["param"] new_mod.param_opt = mod_dict["param_opt"] self.objects.append(new_mod)
五、符合你需求的示例流程
- 输入名称
mariadb,选择模块apt,勾选参数,设置参数为status,force,update,点击添加按钮——第一个对象存入self.objects。 - 输入名称
httpd,选择模块yum,勾选参数,设置参数为status,update,点击添加按钮——第二个对象存入self.objects。 - 如果要修改
mariadb的属性,调用get_mod_by_name("mariadb")找到对象,再调用对应方法修改。 - 点击保存按钮,将所有对象写入目标文件。
内容的提问来源于stack exchange,提问作者admin.unu
相关产品推荐
相关产品推荐

