酸洗set的子类时未调用__getstate__方法

ack*_*ien 5 python pickle

据我了解,在对某个对象调用pickle.dumps时,它将调用该对象的__getstate__方法(如果有的话)以确定要腌制什么。

如果我创建一个类,例如:

class DictClass(dict):
    def __getstate__(self):
        print "pickling"
        return self
Run Code Online (Sandbox Code Playgroud)

我得到这个结果:

>>> pickle.dumps(DictClass())
pickling
'ccopy_reg\n_reconstructor\np0...'
Run Code Online (Sandbox Code Playgroud)

我可以做同样的事情,将“ dict”替换为“ list”:

class ListClass(list):
    def __getstate__(self):
        print "pickling"
        return self

>>> pickle.dumps(ListClass())
pickling
'ccopy_reg\n_reconstructor\np0...'
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用“设置”,则会发生一些不同的事情:

class SetClass(set):
    def __getstate__(self):
        print "pickling"
        return self

>>> pickle.dumps(SetClass())
'c__main__\nSetClass...'
Run Code Online (Sandbox Code Playgroud)

__getstate__方法不会被调用。这是为什么,并且可以指定要腌制的集合的子类的哪一部分?

NPE*_*NPE 5

list没有实现__reduce__(),而set:

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

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