2014-09-20 61 views
4

據我所知,在對象上調用pickle.dumps時,它會調用對象的__getstate__方法(如果有的話)以確定要醃製的東西。__getstate__方法在酸洗集合的子類時不被調用

如果我創建一個類,如:

class DictClass(dict): 
    def __getstate__(self): 
     print "pickling" 
     return self 

我得到這樣的結果:

>>> pickle.dumps(DictClass()) 
pickling 
'ccopy_reg\n_reconstructor\np0...' 

我可以做同樣的事情,與 '名單' 取代 '字典':

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__方法不會被調用。爲什麼會這樣,是否可以指定一個集合的子類的哪一部分來醃製?

回答

4

list沒有實現__reduce__(),而set作用:

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

它在上面的例子中的最後一個元組被醃製,所以SetClass.__getstate__()從未進入圖片。