【发布时间】:2012-11-30 05:44:42
【问题描述】:
我在玩类继承,但我一直纠结于如何在类字典中腌制数据。
如果只转储 self 的字典部分,当我将字典加载回 self 时,self 采用 dict 类型而不是类。但是,如果我腌制整个班级,则会出现错误。
错误
pickle.PicklingError: Can't pickle <class 'main.model'>: it's not the same object as main.model
代码
import os, pickle
class model(dict):
def __init__( self ):
pass
def add( self, id, val ):
self[id] = val
def delete( self, id ):
del self[id]
def save( self ):
print type(self)
pickle.dump( dict(self), open( "model.dict", "wb" ) )
def load( self ):
print 'Before upacking model.dic, self ==',type(self)
self = pickle.load( open( "model.dict", "rb" ) )
print 'After upacking model.dic, self ==',type(self)
if __name__ == '__main__':
model = model()
#uncomment after first run
#model.load()
#comment after first run
model.add( 'South Park', 'Comedy Central' )
model.save()
【问题讨论】:
-
你的代码有什么问题?
-
我无法重现该错误。你用的是哪个版本的python?
save函数是唯一改变的东西吗?顺便说一句,在load中,使用self = pickle.load(...)只会更改名为self的局部变量,它实际上并不会更改model对象。 -
我使用的是 2.7,如果它只是改变
self那么我需要担心这个吗? -
我的意思是 unpickling 实际上并没有做任何事情。
load方法退出的那一刻,未腌制的统计信息将丢失。 Marwan Alsabbagh 在下面的回答显示了一种更好的方法来酸洗和解开物体。
标签: python class inheritance dictionary pickle