在pickle set的子类时没有调用__getstate__方法

时间:2014-09-20 15:02:40

标签: python pickle

根据我的理解,当在一个对象上调用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__方法。为什么这样,是否有可能指定一个子集的哪个部分来挑选?

1 个答案:

答案 0 :(得分:4)

list未实现__reduce__(),而set则执行:

>>> list().__reduce__()
...
TypeError: can't pickle list objects
>>> set().__reduce__()
(<type 'set'>, ([],), None)

上面例子中的最后一个元组被腌制,所以SetClass.__getstate__()永远不会进入图片。