2010-02-27 3 views

ответ

5

Существует пример here, который решает проблему с __getstate__ и __setstate__.

+1

Лучшие Пальцы Первые: P – anijhaw

+0

Фиксированная ссылка: http://docs.python.org/2/library/pickle.html#example – WGH

26

Одним из способов обработки атрибутов экземпляра, которые не пригодны для консервирования объектов являются использование специальных методов для изменения состояния экземпляра класса в: GetState() и SetState(). Вот пример

class Foo(object): 

    def __init__(self, value, filename): 
     self.value = value 
     self.logfile = file(filename, 'w') 

    def __getstate__(self): 
     """Return state values to be pickled.""" 
     f = self.logfile 
     return (self.value, f.name, f.tell()) 

    def __setstate__(self, state): 
     """Restore state from the unpickled state values.""" 
     self.value, name, position = state 
     f = file(name, 'w') 
     f.seek(position) 
     self.logfile = f 

Когда экземпляр Foo маринуется, Python будет солить только значения возвращаются к нему, когда он вызывает метод экземпляра GetState(). Аналогичным образом, при распитии Python будет поставлять неиспользуемые значения в качестве аргумента для метода setstate экземпляра(). Внутри метода setstate() мы можем воссоздать файловый объект на основе информации о названии и позиции, которую мы мариновали, и назначить объект файла атрибуту log-файла экземпляра.

Ссылка: http://www.ibm.com/developerworks/library/l-pypers.html