这两天微信推送一篇文章看了标题挺有兴趣,打开-收藏-关闭一顿三连操作,到了周末懒癌发作想着睡觉一直搁着,最后还是留下了没技术的泪水默默打开看了,越看越觉得有意思,尤其是提到了关于文件对象如何pickle,这里也只讲如何pickle文件,这是本人最关心的,要是有兴趣的同志可以自行看完整文章。
以下都是摘抄自原文章,因为觉的太棒了得分享出来!
原推送文章
- 阅读之前默认读者是知道什么是pickle的,在此不多介绍。
- 其实操作很简单,但是一直没有这种思路,之前的进程间共享复杂自定义对象的问题导致项目暂停了好久没进展最后换了其他方法。
不废话了直接上代码:
class Foo(object):
def __init__(self, value, filename):
self.value = value
self.file = file(filename, 'w')
def __getstate__(self):
"""Return state values to be pickled."""
f = self.file
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
__getstate__
和__setstate__
是用来进行pickle/unpickle的两个默认对象调用方法- Python不支持
file对象
或者说类BinaryIO对象
这种带状态的文件对象进行直接pickle化的 - 在
__getstate__
对象方法中做了三件事- 返回的第一个值
value
,这里value
一般是built-in
类型,Python默认支持pickle化的类型,没有好说的 - 返回
file对象
的name
属性值,也就是文件的路径,当然这个文件路径取决于在进行open
时用的是相对路径还是绝对路径 - 返回文件游标指向位置,文件对象方法
tell()
可以获取当前文件游标指向的位置。
- 返回的第一个值
- 在
__setstate__
对象方法中做了对应的三件事- 把
value
值重新赋值给value
属性 - 先根据
__getstate__
返回的元组第二个元素,也就是文件路径,通过file
打开,当然,要用open
也可以,随便开发者,重点是达到目的。 - 打开文件得到文件对象了,那么接着就是需要知道之前文件的状态,
__getstate__
返回的元组第三个元素就是文件在pickle之前的文件游标指向,通过文件对象的seek()
方法,告诉文件游标应该指向哪里
- 把