python魔术方法之__setstate__和__getstate__

pickle.dumps(obj)序列化对象obj的属性,若该对象的类没有__getstate__方法, 则属性内容由__dict__提供,否则由__getstate__提供,使用__getstate__可自定义序列化对象的属性或其他任意内容;

pickle.loads(bytes)反序列化时,会调用__setstate__方法,该方法所需参数为序列化时__dict__或__getstate__提供的,前者提供为字典格式,后者提供格式具体看其返回值。

import pickle

class DemoState:
    def __init__(self, name="origin", age=23):
        self.name = name
        self.age = age

    def __str__(self):
        return f"name: {self.name}\nage: {self.age}"

    # 反序列化时调用, state 是 __getstate__ 的返回对象,
    # 若没有__getstate__ 这个方法,则state为该类的__dict__的值(字典格式{field: value})
    def __setstate__(self, state):
        print("经过 __setstate__")
        self.name = state["name"]
        self.age = state["age"]

    # 序列化时调用
    def __getstate__(self):
        print("经过__getstate__")
        return dict(name="我是getstate", age=31)


if __name__ == '__main__':
    demo1 = DemoState()
    byte = pickle.dumps(demo1)
    print(byte)
    string = pickle.loads(byte)
    print(string)



你可能感兴趣的:(Python,python)