Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中使用pickle创建持久类_Python_Dictionary_Persistence_Pickle - Fatal编程技术网

如何在Python中使用pickle创建持久类

如何在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

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):
        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对象的代码是什么?