2012-02-23 69 views
1

新的Python一個永久類... 我有下面的類項,擴展字典:如何創建使用泡菜在Python

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,但是,我不完全清楚我應該怎麼做......任何幫助將不勝感激!

回答

3

我寫了一個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。

但是請注意,您必須將原始源文件提供給unpickle。酸洗實際上並沒有保存類本身,只有實例狀態。 Python將需要原始類定義來重新創建。

+0

太棒了!謝謝Keith!但是,我仍然遇到以下錯誤,當我嘗試obj = pickle.load然後打印obj.self:return super(Key,self).__ getitem __(name) KeyError:'self' – 2012-02-23 08:04:00

+0

如果我只是打印obj,奇怪的輸出密鑰({}),而不是{} ...任何想法可能會發生在這裏? – 2012-02-23 08:04:44

+0

ElfsRUs:後者是因爲__repr__方法 - Keith專門設計它看起來像那樣。如果你希望它看起來像{},你可以把它改成'return'%s「%(dict .__ repr __(self),)'。至於第一個問題,你可以發佈你用來獲得追蹤的代碼嗎? – 2012-02-23 08:15:59