2013-08-21 2 views
0

Я пытаюсь разборки экземпляра пользовательского класса, этот класс имеет атрибут под названием «виджеты», который содержит список объектов виджета. Когда я размалываю контейнер, список теряется. Разве нельзя рассортировать список внутри объекта?Почему не удается рассортировать список, являющийся атрибутом объекта?

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() 

Позже я пытаюсь unpickle ...

# 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 [] 

Я попытался рассол и cPickle с теми же результатами.

+0

Я не могу воспроизвести эту проблему - с помощью вашего кода, используя python 2.7.5, 'print container.widgets' prints' [<__ main __. Widget object at 0x1004c2350>] '. Не могли бы вы попробовать запустить ** только ** код выше и посмотреть, есть ли у вас такая же проблема? Возможно, что-то в коде, который вы не показали, вызывает проблему. – Brionius

+0

I ** может ** воспроизвести проблему с помощью python 2.7.5. – martineau

+0

Brionius, это почти точный код, он содержится в одном файле, и я комментирую/раскомментирую травление и рассыпание. Если я запустил все сразу и разборчиво/расклеился в том же скрипте, он работает, но я не уверен, почему это так. –

ответ

5

widgets является атрибутом классаContainer не атрибут экземпляра из Container класса. Когда вы мариновали экземпляр, вы не маринули атрибуты класса, а только атрибуты экземпляра. Поэтому, когда вы ее распечатываете, вы получаете только атрибуты экземпляра.

Вы должны прочитать о случае против атрибутов класса в python docs

Если вы хотите засолить виджеты тоже, то вы должны сделать список атрибутов экземпляра вместо атрибута класса. Вот пример:

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() 
+0

Спасибо за ссылку на документы, я изучаю python, и я пропустил части, которые кажутся такими, какие они работают, как я ожидал бы на других языках, но я продолжаю обнаруживать, что python работает по-другому. –

0

Определенно можно выделить объекты List в Python. Возможно, пользовательский класс, который вы используете, может переопределить методы и __setstate__, где разработчик решил не рассортировать список виджетов, удалив его из набора атрибутов, предназначенных для маринования/не-маринования для этого класса ,

Для получения дополнительной информации обратитесь к here. Было бы хорошо, если вы можете наблюдать исходный код для этого пользовательского класса и проверить, если это действительно так

0

Проблема заключается в том, что виджеты являются атрибутом класса и не были маринованными. Сценарий будет работать, если вы разложитесь в том же сеансе, потому что Container.widgets уже есть то, что вы хотите. Он не будет работать, когда вы начнете новый сеанс, потому что Container.widgets не будет заполнен.

Смежные вопросы