根据我的理解,当在一个对象上调用pickle.dumps时,它将调用该对象的__getstate__方法(如果有的话)来确定要挑选的内容。
如果我创建一个类,如:
class DictClass(dict):
def __getstate__(self):
print "pickling"
return self
我得到了这个结果:
>>> pickle.dumps(DictClass())
pickling
'ccopy_reg\n_reconstructor\np0...'
我可以做同样的事情,用'list'替换'dict':
class ListClass(list):
def __getstate__(self):
print "pickling"
return self
>>> pickle.dumps(ListClass())
pickling
'ccopy_reg\n_reconstructor\np0...'
但如果我使用'set',会发生一些不同的事情:
class SetClass(set):
def __getstate__(self):
print "pickling"
return self
>>> pickle.dumps(SetClass())
'c__main__\nSetClass...'
不会调用__getstate__方法。为什么这样,是否有可能指定一个子集的哪个部分来挑选?
答案 0 :(得分:4)
list
未实现__reduce__()
,而set
则执行:
>>> list().__reduce__()
...
TypeError: can't pickle list objects
>>> set().__reduce__()
(<type 'set'>, ([],), None)
上面例子中的最后一个元组被腌制,所以SetClass.__getstate__()
永远不会进入图片。