Настроить маринованные данные

Некоторые данные не могут быть засолены. Другие данные не следует собирать по другим причинам.

Что будет маринованные может быть определена в __getstate__ методом. Этот метод должен возвращать что-то, что можно выбрать.

На на противоположной стороне __setstate__ : он получит то , что __getstate__ создан и должно инициализировать объект.

 class A(object):
    def __init__(self, important_data):
        self.important_data = important_data

        # Add data which cannot be pickled:
        self.func = lambda: 7

        # Add data which should never be pickled, because it expires quickly:
        self.is_up_to_date = False

    def __getstate__(self):
        return [self.important_data] # only this is needed

    def __setstate__(self, state):
        self.important_data = state[0]

        self.func = lambda: 7  # just some hard-coded unpicklable function

        self.is_up_to_date = False  # even if it was before pickling


 

Теперь это можно сделать:

 >>> a1 = A('very important')
>>>
>>> s = pickle.dumps(a1)  # calls a1.__getstate__()
>>>
>>> a2 = pickle.loads(s)  # calls a1.__setstate__(['very important'])
>>> a2
<__main__.A object at 0x0000000002742470>
>>> a2.important_data
'very important'
>>> a2.func()
7

 

Реализация здесь pikles список с одним значением: [self.important_data] . Это просто пример, __getstate__ мог бы вернуться все , что пригодны для консервирования, до тех пор , как __setstate__ знает , как сделать oppoisite. Хорошей альтернативой является словарем всех значений: {'important_data': self.important_data} .

Конструктор не называется! Обратите внимание , что в предыдущем примере экземпляр a2 был создан в pickle.loads никогда не называя A.__init__ , так A.__setstate__ пришлось инициализировать все , что __init__ бы инициализирована , если она была вызвана.