
Python 使用 __getstate__ 和 __setstate__ 魔法方法
发布日期:2021-05-06 19:34:31
浏览次数:10
分类:技术文章
本文共 1943 字,大约阅读时间需要 6 分钟。
__getstate__ 与 __setstate__ 两个魔法方法分别用于Python 对象的序列化与反序列化
在序列化时, _getstate__ 可以指定将那些信息记录下来, 而 __setstate__ 指明如何利用已记录的信息
先创建一个基类
class Demo: def __init__(self, name, age=0): self.name = name self.age = age def __str__(self): return f"name: {self.name}\nage: {self.age}"
继承Demo
, 并实现 __getstate__ 与 __setstate__ 方法
class DemoState1(Demo): # 反序列化时调用, state 是 __getstate__ 的返回对象 def __setstate__(self, state): print("invoke __setstate__") # 将记录的信息("Python3") 赋给 name self.name = state self.age = 31 # 序列化时调用 def __getstate__(self): print("invoke __getstate__") # 记录信息 “Python3” return "Python3"
测试调用流程
In [3]: import pickleIn [4]: demo_1 = DemoState1("None") # "None" 0In [5]: print(demo_1)name: Noneage: 0In [6]: demo_bytes_1 = pickle.dumps(demo_1) # 序列化为字节串invoke __getstate__In [7]: print(demo_bytes_1) # 仅对象中的字符串信息是可读的b'\x80\x03c__main__\nDemoState1\nq\x00)\x81q\x01X\x07\x00\x00\x00Python3q\x02b.'In [8]: demo_object_1 = pickle.loads(demo_bytes_1)invoke __setstate__In [9]: print(demo_object_1)name: Python3age: 31
可以省略 __setstate__, 但 __getstate__ 必须返回一个字典, 字典的内容被加载到当前的对象
class DemoState2(Demo): # 省略 __setstate__ # 自动将 __getstate__ 的返回对象添加到当前对象的属性 # 序列化时调用 def __getstate__(self): # 必须返回字典 state = { "name": "C", "age": 50, "address": "Bell Lab"} return state
测试
In [11]: demo_2 = DemoState2("None")In [12]: demo_bytes_2 = pickle.dumps(demo_2)In [13]: print(pickle.loads(demo_bytes_2))name: Cage: 50
对象本身没有 address 属性, 因此反序列化时被忽略了
如果 __getstate__ 与 __setstate__ 都省略, 那么就是默认情况, 自动保存和加载对象的属性字典 __dict__
In [14]: js = Demo("JavaScript", 26)In [15]: js.__dict__ # 对象的属性字典 Out[16]: { 'name': 'JavaScript', 'age': 26}In [17]: js_bytes = pickle.dumps(js)In [18]: print(pickle.loads(js_bytes))name: JavaScriptage: 26
大多数时候保持默认情况即可, 但是遇到不可序列化的对象, 例如 self.file = open("filename")
, 就需要忽略掉该属性
发表评论
最新留言
不错!
[***.144.177.141]2025年03月13日 08时44分17秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
天涯人脉通讯录 - 设计草图
2019-03-03
wxWidgets 最新版2.8.11,终于放出来了
2019-03-03
python学习09:暂停一秒后再输出
2019-03-03
4、Mysql 主从复制报错[ERROR] [MY-013117] 踩坑
2019-03-03
6、ShardingSphere 之 读写分离
2019-03-03
C++ STL
2019-03-03
拓扑排序
2019-03-03
解方程
2019-03-03
练习赛 位运算 思维 思维
2019-03-03
Netty 粘包 拆包 | 史上最全解读
2019-03-03
protobuf + maven 爬坑记
2019-03-03
考了400分?不好意思,可能连这些“变态”学校的复试线都没够着!
2019-03-03
【调剂】211北京邮电大学2020年计算机学院硕士研究生招生缺额信息
2019-03-03
【招生目录和招生简章】浙江大学 华北电力大学 河南工业大学 福建师范大学...
2019-03-03
这些考研阅卷潜规则你知道几个?
2019-03-03
【考研英语】考研英语小作文万能模板(致歉信)
2019-03-03
【数据结构与算法】队列
2019-03-03
【研究生】PyTorch 1.0稳定版正式发布,并向开发者提供免费AI课程
2019-03-03
为何二战考生成功率远远大于应届?
2019-03-03
计算机专业【本科生】毕业还不如【专科生】?
2019-03-03