据我了解,在对某个对象调用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__方法不会被调用。这是为什么,并且可以指定要腌制的集合的子类的哪一部分?
list没有实现__reduce__(),而set:
>>> list().__reduce__()
...
TypeError: can't pickle list objects
>>> set().__reduce__()
(<type 'set'>, ([],), None)
Run Code Online (Sandbox Code Playgroud)
这是上面例子中最后一个被腌制的元组,所以SetClass.__getstate__()永远不要进入图片。
| 归档时间: |
|
| 查看次数: |
479 次 |
| 最近记录: |