python【__setstate__】【__getstate__】

  1. 使用方法

# 自定义对象序列化的时候使用

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}"


class DemoState1(Demo):
    # 反序列化时调用, state 是 __getstate__ 的返回对象,不定义__getstate__ 返回 {'name': 'None', 'age': 0},当前对象的属性
    def __setstate__(self, state):
        print("invoke __setstate__")
        # 将记录的信息("Python3") 赋给 name
        self.name = state
        self.age = 31

    # 序列化时调用
    # 定义后:返回 name: Python3
    # 不定义:name: {'name': 'None', 'age': 0}
    def __getstate__(self):
        print("invoke __getstate__")
        # 记录信息 “Python3”
        return "Python3"



import pickle

demo_1 = DemoState1("None") # "None" 0
print(demo_1)


demo_bytes_1 = pickle.dumps(demo_1) # 序列化为字节串, __getstate__
print(demo_bytes_1) # 仅对象中的字符串信息是可读的

demo_object_1 = pickle.loads(demo_bytes_1) # 反序列化, __setstate__
print(demo_object_1)


# 如果 __getstate__ 与 __setstate__ 都省略, 那么就是默认情况, 自动保存和加载对象的属性字典 __dict__
# js = Demo("JavaScript", 26)
# print(js.__dict__) # 对象的属性字典
# js_bytes = pickle.dumps(js)
# print(pickle.loads(js_bytes))

posted @ 2021-10-20 17:41  该显示昵称已被使用了  阅读(204)  评论(0编辑  收藏  举报