2

我试图腌制一个自定义类的实例,这个类有一个名为“widgets”的属性,其中包含一个小部件对象列表。当我腌制容器时,列表丢失了。不能在对象中腌制列表吗?

import pickle

filename = 'container.pkl'

class Container(object):
    widgets = []

class Widget(object):
    pass

c = Container()
c.name = "My Container"

w = Widget()
w.name = "My Widget"

c.widgets.append(w)

data = open(filename, 'wb')
pickle.dump(c, data)
data.close()

后来我试着解开...

# assume I have imported the classes and filename here

data = open(filename, 'rb')
container = pickle.load(data)
data.close()


print container.name # shows the pickled name
print container.widgets # shows []

我尝试过 pickle 和 cPickle ,结果相同。

4

3 回答 3

7

widgets Container的属性而不是类实例的属性Container。当您腌制实例时,您并没有腌制类属性,而只是腌制了实例属性。所以当你解开它时,你只会得到实例属性。

您应该阅读python 文档中有关实例与类属性的信息

如果您也想腌制小部件,那么您应该使列表成为实例属性而不是类属性。这是一个例子:

import pickle

filename = 'container.pkl'

class Container(object):
    def __init__(self, name):
        self.name = name
        self.widgets = []

class Widget(object):
    def __init__(self, name):
        self.name = name

c = Container('My Container')
w = Widget('My Widget')

c.widgets.append(w)

data = open(filename, 'wb')
pickle.dump(c, data)
data.close()
于 2013-08-21T15:51:43.533 回答
0

绝对可以在 Python 中腌制 List 对象。您正在使用的自定义类可能已经覆盖了__getstate__and__setstate__方法,其中开发人员决定不通过从要为该类腌制/取消腌制的属性集中删除小部件列表来腌制小部件列表。

请参阅此处了解更多信息。如果您可以观察此自定义类的源代码并检查是否确实如此,那就太好了

于 2013-08-21T15:42:58.480 回答
0

问题是小部件是一个类属性并且没有被腌制。如果您在同一会话中取消腌制,该脚本将似乎可以工作,因为 Container.widgets 已经是您想要的。当您开始一个新会话时它不会工作,因为 Container.widgets 不会被填充。

于 2013-08-21T15:52:25.520 回答