Python类继承:dict如何pickle(保存、加载)

Python类继承:dict如何pickle(保存、加载),python,class,inheritance,dictionary,pickle,Python,Class,Inheritance,Dictionary,Pickle,我在玩弄类继承,我一直在研究如何在类字典中pickle数据 如果只转储self的dictionary部分,当我将dictionary加载回self时,self将采用dict类型而不是类。但是如果我把整个班级都泡菜了,我就会出错 错误 如果您只想拥有一个名为model的类,该类是dict的子类,可以正确地pickle和unpickle回一个同样是model类型的对象,那么您不需要做任何特殊的事情。您在示例中定义的要添加和删除的方法是不必要的,您可以直接在模型实例上执行这些操作,就像在任何其他dic

我在玩弄类继承,我一直在研究如何在类字典中pickle数据

如果只转储self的dictionary部分,当我将dictionary加载回self时,self将采用dict类型而不是类。但是如果我把整个班级都泡菜了,我就会出错

错误
如果您只想拥有一个名为model的类,该类是dict的子类,可以正确地pickle和unpickle回一个同样是model类型的对象,那么您不需要做任何特殊的事情。您在示例中定义的要添加和删除的方法是不必要的,您可以直接在模型实例上执行这些操作,就像在任何其他dict上执行这些操作一样。可以使用pickle模块而不是类本身来执行save和load方法

代码

import pickle

class model(dict):
    pass

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

print type(a), a
print type(b), b
输出

<class '__main__.model'> {}
<class '__main__.model'> {}
进一步阅读


dict的一个子类是pickable的一个很好的例子是。它是python标准库的一部分,是用python实现的,因此您可以在源代码处获得峰值。这个定义是172行代码,所以没有太多的代码需要浏览。它还必须实现
\uuuuu reduce\uuuu
方法来实现酸洗,因为它有关于也需要酸洗和取消酸洗的项目顺序的信息。这是一个很好的例子,说明了为什么您可能想要创建自己的dict子类,它添加了一个非常有用的特性,即尊重添加到dict中的值的顺序。

如果您只想拥有一个名为model的类,该类是dict的子类,并且可以正确地pickle和unpickle回一个同样属于model类型的对象,那么您不必做任何特殊的事情。您在示例中定义的要添加和删除的方法是不必要的,您可以直接在模型实例上执行这些操作,就像在任何其他dict上执行这些操作一样。可以使用pickle模块而不是类本身来执行save和load方法

代码

import pickle

class model(dict):
    pass

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

print type(a), a
print type(b), b
输出

<class '__main__.model'> {}
<class '__main__.model'> {}
进一步阅读


dict的一个子类是pickable的一个很好的例子是。它是python标准库的一部分,是用python实现的,因此您可以在源代码处获得峰值。这个定义是172行代码,所以没有太多的代码需要浏览。它还必须实现
\uuuuu reduce\uuuu
方法来实现酸洗,因为它有关于也需要酸洗和取消酸洗的项目顺序的信息。这是一个很好的例子,说明了为什么您可能希望创建自己的dict子类,它添加了非常有用的功能,即尊重添加到dict的值的顺序。

您的代码有什么问题?我无法重现错误。您使用的是哪个版本的python?
save
功能是唯一改变的功能吗?顺便说一句,在
load
中,使用
self=pickle.load(…)
仅更改名为
self
的局部变量,实际上并没有更改
模型
对象。我使用的是2.7,如果它只是在改变自己,那么我需要担心吗?我的意思是,取消勾选实际上并没有做任何事情。
load
方法退出未勾选状态的瞬间丢失。Marwan Alsabbagh在下面的回答显示了一种更好的酸洗和解扣对象的方法。您的代码有什么问题?我无法重现错误。您使用的是哪个版本的python?
save
功能是唯一改变的功能吗?顺便说一句,在
load
中,使用
self=pickle.load(…)
仅更改名为
self
的局部变量,实际上并没有更改
模型
对象。我使用的是2.7,如果它只是在改变自己,那么我需要担心吗?我的意思是,取消勾选实际上并没有做任何事情。
load
方法退出未勾选状态的瞬间丢失。Marwan Alsabbagh在下面的回答显示了一种更好的酸洗和解酸洗对象的方法;也很简单。@Crispy我更新了答案,补充了一些可能对您有用的进一步阅读。非常感谢我一直在寻找有关这方面的资源。非常感谢,这有助于解释类继承;也很简单。@Crispy我更新了一些可能对你有用的进一步阅读的答案。非常感谢我一直在寻找关于这个的一些资源。
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