__getstate__ 与 __setstate__的作用

        一些对象类型(譬如,文件对象)不能进行 pickle。处理这种不能 pickle 的对象的实例属性时可以使用特殊的方法( _getstate_() 和 _setstate_() )来修改类实例的状态。这里有一个 Foo 类的示例,我们已经对它进行了修改以处理文件对象属性:

class Foo(object):  
    def __init__(self, value, filename):  
        self.value = value  
        self.logfile = file(filename, 'w')  
    def __getstate__(self):  
        """Return state values to be pickled."""  
        f = self.logfile  
        return (self.value, f.name, f.tell())  
    def __setstate__(self, state):  
        """Restore state from the unpickled state values."""  
        self.value, name, position = state  
        f = file(name, 'w')  
        f.seek(position)  
        self.logfile = f  
        pickle Foo 的实例时,Python 将只 pickle 当它调用该实例的 _getstate_() 方法时返回给它的值。类似的,在 unpickle 时,Python 将提供经过 unpickle 的值作为参数传递给实例的 _setstate_() 方法。在 _setstate_() 方法内,可以根据经过 pickle 的名称和位置信息来重建文件对象,并将该文件对象分配给这个实例的 logfile 属性。


转自:http://www.cnblogs.com/cobbliu/archive/2012/09/04/2670178.html

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
__setstate__()和__getstate__()是Python中用于序列化和反序列化对象的特殊方法。 __setstate__()方法是在反序列化时调用的,它接受一个参数state,该参数是__getstate__()方法返回的对象。在该方法中,您可以将已保存的状态信息重新分配给对象的属性。 __getstate__()方法是在序列化时调用的,它返回一个字典,该字典包含需要保存为对象状态的信息。在该方法中,您可以决定哪些属性需要保存以及如何保存它们。 引用提供了一个示例,其中__setstate__()方法被省略了,而__getstate__()方法返回一个包含对象属性的字典。 引用是另一个示例,其中DemoState1类继承自Demo类,并实现了__setstate__()和__getstate__()方法。在__setstate__()方法中,记录的信息被重新分配给对象的属性。在__getstate__()方法中,返回了一个字符串作为对象的状态信息。 引用中的示例展示了如何使用pickle模块来序列化和反序列化对象。在该示例中,DemoState类实现了__setstate__()和__getstate__()方法,其中__getstate__()方法返回一个字典,包含对象的名称和年龄信息。 总而言之,__setstate__()方法用于反序列化时重新分配对象属性的值,而__getstate__()方法用于序列化时返回对象的状态信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Python 使用 __getstate__ 和 __setstate__ 魔法方法](https://blog.csdn.net/jiang_huixin/article/details/109674221)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [python魔术方法之__setstate__和__getstate__](https://blog.csdn.net/weixin_43580966/article/details/123740419)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值