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)



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
__setstate__和__getstate__是Python中的两个特殊方法,用于序列化和反序列化对象。当我们需要将一个对象保存到文件或者通过网络传输时,我们需要将其序列化为字节流,然后再反序列化为对象。而__setstate__和__getstate__就是用来实现这个功能的。 __getstate__方法返回一个字典,其中包含了需要序列化的对象的状态信息。这个字典会被pickle模块序列化为字节流。而__setstate__方法则接受一个字典作为参数,用于恢复对象的状态信息。 下面是一个简单的例子,演示了如何使用__getstate__和__setstate__方法来序列化和反序列化一个对象: ```python import pickle class MyClass: def __init__(self, name): self.name = name def __getstate__(self): return {'name': self.name} def __setstate__(self, state): self.name = state['name'] obj = MyClass('test') data = pickle.dumps(obj) new_obj = pickle.loads(data) print(new_obj.name) # 输出:test ``` 在这个例子中,我们定义了一个名为MyClass的类,其中包含了一个属性name。我们实现了__getstate__和__setstate__方法,用于序列化和反序列化对象。在__getstate__方法中,我们返回了一个字典,其中包含了需要序列化的对象的状态信息。在__setstate__方法中,我们接受一个字典作为参数,用于恢复对象的状态信息。 我们创建了一个MyClass的实例,并将其序列化为字节流。然后我们使用pickle.loads方法将字节流反序列化为一个新的对象。最后,我们输出了新对象的name属性,验证了反序列化的正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值