首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python类继承: dict how to save(save,load)

Python类继承: dict how to save(save,load)
EN

Stack Overflow用户
提问于 2012-11-30 13:44:43
回答 1查看 1.8K关注 0票数 1

我正在玩弄类继承,并且我被困在如何在类字典中提取数据。

如果只转储self的字典部分,当我将字典加载回self时,self采用dict类型而不是class。但是如果我把整个类都处理掉了,我就会得到一个错误。

错误

代码语言:javascript
复制
pickle.PicklingError: Can't pickle <class 'main.model'>: it's not the same object as main.model 

代码

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-30 14:15:09

如果你想做的只是有一个叫做model的类,它是dict的子类,并且可以被正确的酸洗和去酸洗回同样属于model类型的对象,那么你不需要做任何特殊的事情。您在示例中定义的添加和删除方法是不必要的,您可以直接在模型实例上执行它们,就像您对任何其他dict所做的那样。保存和加载方法可以使用pickle模块完成,而不是在类本身上完成。

代码

代码语言:javascript
复制
import pickle

class model(dict):
    pass

a = model()
pickled = pickle.dumps(a)
b = pickle.loads(pickled)

print type(a), a
print type(b), b

输出

代码语言:javascript
复制
<class '__main__.model'> {}
<class '__main__.model'> {}

下面是另一个版本,它可能更符合你想要实现的目标。但是你应该用而不是这样做。load方法很奇怪,保存方法也很奇怪。我将下面的代码放在下面,以显示它可以完成,但不是您真正想要做的事情,因为它最终会非常令人困惑。

另一个版本(不这样做)

代码语言:javascript
复制
import pickle

class model(dict):
    def save(self):
        with open("model.dict", "wb") as f:
            pickle.dump(self, f)

    def load(self): 
        with open("model.dict") as f:
            return pickle.load(f)

#comment after first run
test = model()
test['South Park'] = 'Comedy Central'
test.save()
print type(test), test

#uncomment after first run
test2 = model().load()
print type(test2), test2

进一步阅读

collections.OrderedDict就是一个很好的例子,它是dict的一个子类。它是python标准库的一部分,并且是用python实现的,因此您可以在源代码中达到顶峰。它的定义是172行代码,所以不需要查看太多的代码。它还必须实现__reduce__方法来实现酸洗,因为它有关于也需要酸洗和取消酸洗的项的顺序的信息。这是一个很好的例子,说明了为什么你可能想要创建自己的dict子类,它添加了一个非常有用的功能,即尊重添加到dict中的值的顺序。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13639740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档