博客
关于我
Python 使用 __getstate__ 和 __setstate__ 魔法方法
阅读量:291 次
发布时间:2019-03-03

本文共 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"), 就需要忽略掉该属性

转载地址:http://bkvm.baihongyu.com/

你可能感兴趣的文章
2020电工(初级)考试及电工(初级)考试软件
查看>>
2020N1叉车司机模拟考试题库及N1叉车司机复审模拟考试
查看>>
2020熔化焊接与热切割考试及熔化焊接与热切割考试题库
查看>>
2020年G3锅炉水处理报名考试及G3锅炉水处理考试申请表
查看>>
2020年制冷与空调设备运行操作答案解析及制冷与空调设备运行操作考试总结
查看>>
2020年保育员(初级)考试资料及保育员(初级)新版试题
查看>>
2020年茶艺师(高级)考试内容及茶艺师(高级)考试申请表
查看>>
2021年烟花爆竹经营单位安全管理人员考试及烟花爆竹经营单位安全管理人员考试试卷
查看>>
2021年过氧化工艺试题及答案及过氧化工艺考试平台
查看>>
2021年重氮化工艺考试题库及重氮化工艺考试报名
查看>>
2021年车工(高级)考试总结及车工(高级)试题及答案
查看>>
2021年压力焊证考试及压力焊实操考试视频
查看>>
2021年低压电工考试及低压电工考试申请表
查看>>
2021年低压电工考试及低压电工考试申请表
查看>>
2021年A特种设备相关管理(电梯)考试APP及A特种设备相关管理(电梯)复审考试
查看>>
2021年美容师(初级)考试报名及美容师(初级)新版试题
查看>>
2021年N1叉车司机考试题及N1叉车司机复审模拟考试
查看>>
2021年危险化学品经营单位主要负责人考试APP及危险化学品经营单位主要负责人多少钱
查看>>
2021年T电梯修理考试技巧及T电梯修理模拟考试软件
查看>>
2021年R2移动式压力容器充装考试题及R2移动式压力容器充装找答案
查看>>