关于python对象序列化的一些记录

关于python对象序列化的一些记录

其实这个问题,老早之前在用torch.save时就有了,torch.save存模型和存权重有啥区别,今天来具体说一说。

首先python序列化的目的是为了把内存中的结构化数据存到磁盘上也有同样的结构,常用的工具是pickle,命令是pick.dumps和pick.loads,不带s的dump和load是直接用于文件描述符的。

那序列化时到底存了什么呢,存了以self.开头的属性,是属性,不是方法哈,也就是方法是没有存下来的,方法是类的,而不是对象的,对象只有属性,这里插一个小细节,就是我们用__dict__去获得对象属性时,只有属性,没有方法,而获得类属性时,则有。下面图展示了过程,我们可以清晰的看到类的属性和对象的属性的区别,对象的属性一定是带有self.前缀的,所以self开头的method B是对象的属性,而不是类的属性。
在这里插入图片描述

在这里插入图片描述

当我们明白类的属性和对象的属性时,我们就要知道pickle序列化时,是序列化对象的属性,至于类的方法则没有保存,所以当我们反序列化一个pth文件时,会重建一个类对象,但是不会去运行__init__之类的函数,而是将之前保存的属性赋值给这个对象,所以即使你在代码里修改了self.xx的值,也不会影响反序列化的结果,因为毕竟修改的是类对象的属性,之前生成的类对象自然不会受影响。

一个比较麻烦的点是,我们如果需要反序列化一个对象,那么不能在代码里面删除这个类,否则会失败,同时,对象的属性方法也不能删除,否则就会失败。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值