首页 > 编程语言 >修改python jsonpickle源码, 实现不序列化对象私有成员(3)

修改python jsonpickle源码, 实现不序列化对象私有成员(3)

时间:2024-12-20 13:42:10浏览次数:3  
标签:__ obj python self 私有 源码 var 序列化 cls

发现之前修改源码后, 虽然过滤掉对象的私有成员, 但是反序列化的时候, 发现生成的对象只有只有公有成员, 不包括私有成员. 这不是我想要的, 因为没有私有成员, 对象就不完整了, 并且有时候还需要一些私有成员的默认值.
所以, 还需要再优化一下.
修改unpickler.py文件的def _restore_object_instance(self, obj, cls, class_name=''):函数:

#instance = cls.__new__(cls, *args, **kwargs)
instance = cls(*args, **kwargs)

注释掉的代码使用cls.__new__来创建类的实例, 它不会调用类的__init__函数, 所以不会初始化私有变量. 所以我们修改一下, 采用正常的方式创建类的实例, 然后再用之前存储的json数据反序列化覆盖成员变量的值.

效果

示例代码:

#import jsonpickle
import my_pickle

class InnerClass:
    def __init__(self):
        self.public_var = '哈哈'
        self._private_var = 20

class OuterClass:
    def __init__(self):
        self.public_var = 100
        self._private_var = 200
        self.inner = InnerClass()  # 嵌套对象

obj = OuterClass()
#obj = {'hzqtest':10,'_abc':100}
#json_str = my_pickle.encode(obj,filter_func=test)
#my_pickle.obj2file(obj,'hzqtest.json')
obj2 = my_pickle.file2obj('hzqtest.json')
print(vars(obj2))  # 输出应仅包含 public_var

输出:
{'public_var': 100, '_private_var': 200, 'inner': <__main__.InnerClass object at 0x0000019045C8FB00>}
可见私有变量也被正确创建了.

标签:__,obj,python,self,私有,源码,var,序列化,cls
From: https://www.cnblogs.com/huzhongqiang/p/18619021

相关文章

  • ssm基于Kinect和可穿戴的健康管理系统29d6u--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容项目名称:基于Kinect和可穿戴的健康管理系统一、项目背景随着人口老龄化加剧及生活节奏加快,健康管理成为社会关注的焦点。微软Kinect作为体感交互......
  • ssm基于bs架构的高校在线考试系统0brge程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景与意义随着信息技术的不断进步,高校教育正逐步向数字化、网络化转型。传统的纸质考试方式已难以满足现代教育的需求,尤其是在当前疫情背......
  • Python旅游信息管理系统v7c4w(Pycharm Flask Django Vue mysql)
    文章目录项目介绍和开发技术介绍具体实现截图开发技术开发与测试:设计思路系统测试可行性分析核心代码部分展示文章目录/写作提纲参考源码/演示视频获取方式项目介绍和开发技术介绍旅游信息管理系统的现状来进行开发的,具体根据现实的需求来实现旅游信息管理系统网络......
  • Python古玩玉器藏品交易系统(Pycharm Flask Django Vue mysql)
    文章目录项目介绍和开发技术介绍具体实现截图开发技术开发与测试:设计思路系统测试可行性分析核心代码部分展示文章目录/写作提纲参考源码/演示视频获取方式项目介绍和开发技术介绍实现了一个古玩玉器交易系统。古玩玉器交易系统的主要用户分为用户、管理员。管理员......
  • 源码分析之Openlayers中ZoomSlider滑块缩放控件
    概述ZoomSlider滑块缩放控件就是Zoom缩放控件的异形体,通过滑块的拖动或者点击滑槽,实现地图的缩放;另外其他方式控制地图缩放时,也会引起滑块在滑槽中的位置改变;即ZoomSlider滑块缩放控件会监听地图的缩放级别,当级别发生改变时,也会触发ZoomSlider中注册的事件,从而改变滑块的相......
  • python 多版本安装
    当不同的项目需要不同的python版本时,需要安装多个版本的python1.官网下载所有需要的版本:以windows为例:https://www.python.org/downloads/windows/2.安装不同的版本,注意安装路径,默认路径为:C:\Users\Administrator\AppData\Local\Programs\Python......
  • RK3566触摸驱动产品实战 配置设备树 I2C驱动框架(附源码)
    引言:相信大家在学完相关驱动框架很少真正的运用在实际的产品案例中,对设备树以及驱动框架还是非常的陌生,其次就是在编写相关驱动还有完成项目任务时的一些思路的引导,这些都是需要补足的,接下来,我们将之前理论知识与此文章内容结合,真正的将理论运用在实际案例中,形成自己的知识框......
  • ssm毕设汽车维修服务信息系统源码+程序+论文
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容选题背景随着汽车工业的迅猛发展和汽车保有量的持续增长,汽车维修服务行业迎来了前所未有的发展机遇与挑战。当前,关于汽车维修服务的研究主要集中在提升服务效......
  • ssm毕设汽车维修管理系统源码+程序+论文
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容选题背景随着汽车工业的快速发展和汽车保有量的不断增加,汽车维修行业迎来了前所未有的发展机遇与挑战。关于汽车维修管理系统的研究,现有研究主要以传统的手工......
  • Redis中的SpringDataRedis 序列化和反序列化及API命令(详细讲解+代码)
    目录API函数SpringDataRedis序列化SpringDataRedis反序列化概念 在SpringDataRedis中,序列化和反序列化是关键操作,选择合适的序列化方式可以提高性能和兼容性。根据具体需求,可以使用默认的序列化方式,或自定义序列化器来满足特定要求。1.序列化和反序列化的基本......