2016-03-03 3 views
1

Я пытаюсь рассортировать список объектов, в которых объекты содержат список. Когда я открываю маринованный файл, я могу видеть любые данные в моих объектах, кроме как из списка. Я помещаю код ниже, поэтому это имеет смысл.Python Pickle не сохраняет весь объект

Объект, который содержит список.

class TestPickle: 
    testNumber = None 
    testList = [] 

    def addNumber(self, value): 
     self.testNumber = value 
    def getNumber(self): 
     return self.testNumber 

    def addTestList(self, value): 
     self.testList.append(value) 
    def getTestList(self): 
     return self.testList 

В этом примере я создаю список вышеуказанного объекта (я добавляю один объект, чтобы сохранить его краткое)

testPKL = TestPickle() 
testList = [] 
testPKL.addNumber(12) 
testPKL.addTestList(1) 
testPKL.addTestList(2) 
testList.append(testPKL) 

with open(os.path.join(os.path.curdir, 'test.pkl'), 'wb') as f: 
    pickle.dump(testList, f) 

Вот пример меня открытие маринованные файла и пытается получить доступ данные, я могу только получить testNumber сверху, testList возвращает пустой список.

pklResult = None 
with open(os.path.join(os.path.curdir, 'test.pkl'), 'rb') as f: 
    pklResult = pickle.load(f) 

for result in pklResult: 
    print result.getNumber() # returns 12 
    print result.testNumber # returns 12 
    print result.getTestList() # returns [] 
    print result.testList  # returns [] 

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

ответ

2

testNumber и testList оба являются атрибутами класса. testNumber имеет неизменный тип, поэтому его модификация создает новый атрибут экземпляра, но testList имеет изменяемый тип и может быть изменен на месте. Следовательно, изменение testList не создает новый атрибут экземпляра и остается как атрибут класса. Вы можете проверить это -

print testPKL.__dict__ 
{'testNumber': 12} 
print result.__dict__ 
{'testNumber': 12} 

Итак, когда вы получаете доступ result.testList, он ищет класс атрибута , что [] в вашем случае.

Решение

Вы храните экземпляр в рассоле, поэтому используйте атрибут экземпляра. Изменить TestPickle класс, указанный ниже -

class TestPickle: 
    def __init__(self): 
     self.testNumber = None 
     self.testList = [] 

    def addNumber(self, value): 
     self.testNumber = value 
    def getNumber(self): 
     return self.testNumber 

    def addTestList(self, value): 
     self.testList.append(value) 
    def getTestList(self): 
     return self.testList 
+0

Спасибо, что было. – user1904898