python魔术方法之__setstate__和__getstate__

本文介绍了Python中Pickle模块的高级用法,包括如何利用__getstate__和__setstate__方法来自定义对象的序列化和反序列化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值