为什么不能挑选作为对象属性的列表?

fun*_*oid 0 python pickle python-2.7

我试图挑选一个自定义类的实例,这个类有一个名为"widgets"的属性,它包含一个widget对象列表.当我腌制我的容器时,列表就丢失了.是不是可以在对象中挑选一个列表?

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()
Run Code Online (Sandbox Code Playgroud)

后来我试着破坏...

# 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 []
Run Code Online (Sandbox Code Playgroud)

我尝试了pickle和cPickle同样的结果.

Vik*_*kez 5

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()
Run Code Online (Sandbox Code Playgroud)