【发布时间】:2016-08-07 10:28:40
【问题描述】:
我不明白 __reduce__ 函数在 Python 中 pickle 模块的情况下是如何工作的。
假设我有以下课程:
class Foo(object):
def __init__(self, file_name = 'file.txt'):
self.file_name = file_name
self.f = open(self.file_name, 'w')
不能腌制因为pickle模块不知道如何编码文件句柄:
foo = Foo()
print(pickle.dumps(foo))
输出:
TypeError: can't pickle file objects
但如果我添加 __reduce__ 函数,它会成功编码:
import pickle
class Foo(object):
def __init__(self, file_name = 'file.txt'):
self.file_name = file_name
self.f = open(self.file_name, 'w')
def __reduce__(self):
return (self.__class__, (self.file_name, ))
foo = Foo()
print(pickle.dumps(foo))
输出:
c__main__
Foo
p0
(S'file.txt'
p1
tp2
Rp3
.
如果pickle.dumps 调用失败,__reduce__ 函数只是返回“指令”让解构器重新创建原始对象,这对吗?
从文档中我不清楚。
【问题讨论】:
标签: python serialization pickle