如何在Python中使用pickle创建持久类
python新手。。。 我有以下扩展dict的类密钥:如何在Python中使用pickle创建持久类,python,dictionary,persistence,pickle,Python,Dictionary,Persistence,Pickle,python新手。。。 我有以下扩展dict的类密钥: class Key( dict ): def __init__( self ): self = { some dictionary stuff... } def __getstate__(self): state = self.__dict__.copy() return state def __setstate__(self, state): s
class Key( dict ):
def __init__( self ):
self = { some dictionary stuff... }
def __getstate__(self):
state = self.__dict__.copy()
return state
def __setstate__(self, state):
self.__dict__.update( state )
我想使用pickle.dump保存类的实例及其数据,然后使用pickle.load检索数据。我知道我应该以某种方式更改getstate和setstate,但是,我并不完全清楚我应该如何做。。。任何帮助都将不胜感激 我编写了dict的一个子类,它就是这样做的
class AttrDict(dict):
"""A dictionary with attribute-style access. It maps attribute access to
the real dictionary. """
def __init__(self, *args, **kwargs):
dict.__init__(self, *args, **kwargs)
def __getstate__(self):
return self.__dict__.items()
def __setstate__(self, items):
for key, val in items:
self.__dict__[key] = val
def __repr__(self):
return "%s(%s)" % (self.__class__.__name__, dict.__repr__(self))
def __setitem__(self, key, value):
return super(AttrDict, self).__setitem__(key, value)
def __getitem__(self, name):
return super(AttrDict, self).__getitem__(name)
def __delitem__(self, name):
return super(AttrDict, self).__delitem__(name)
__getattr__ = __getitem__
__setattr__ = __setitem__
def copy(self):
return AttrDict(self)
它基本上将状态转换为一个基本元组,并将其重新转换为unpickle
但请注意,您必须将原始源文件还原为可用于取消pickle。酸洗实际上并不保存类本身,只保存实例状态。Python需要原始的类定义来重新创建。这太棒了!谢谢你,基思!但是,当我尝试obj=pickle.load然后打印obj.self时,仍然会出现以下错误:return super(Key,self)。\uuuu getitem\uuuu(name)KeyError:'self'如果我只打印obj,我会得到奇怪的输出键({}),而不是{}。。。知道这里会发生什么吗?ElfsRUs:后者是因为repr方法——Keith专门设计了这样的方法。如果希望它看起来像{},可以将其更改为
返回“%s”%(dict.\uu repr\uuuu(self))
。关于第一个问题,你能发布你用来获取回溯的代码吗?@DavidRobinson感谢你的澄清,我正在做以下工作:key=pickle.load(open(sys.argv[2],“rb”))print key.self。你最初用来pickle对象的代码是什么?