#python #python-3.x #pickle #marshalling
#python #python-3.x #травление #сортировка
Вопрос:
У меня есть класс, который может сериализовать себя, используя pickle
модуль.
Этот класс имеет некоторые атрибуты, которые инициализируются как False
:
class A():
_bool_attribute = False
Методы получения и установки устанавливаются и используются следующим образом:
@property
def bool_attribute(self):
return self._bool_attribute
@bool_attribute.setter
def bool_attribute(self, b):
self._bool_attribute = b
У него есть несколько методов, которые изменяют эти атрибуты, например:
def method_ex(self):
self.bool_attribute = True
Однако при «сохранении» и «восстановлении» с использованием pickle значение атрибута не согласуется:
>>> s = A()
>>> s.method_ex()
>>> s.bool_attribute
True
>>> s.save()
>>> t = A()
>>> t.load()
>>> t.bool_attribute
False
«Сохранение» и «загрузка» выполняются просто так:
def save(self):
pickle.dump(self, open("file", "wb"))
def load(self):
self = pickle.load(open("file"), "rb))
Почему значение атрибута не является обоими True
? Как я могу правильно выбрать это значение, как и в случае с остальным классом?
Комментарии:
1.
self = pickle.load(open("file"), "rb)
присваивает загруженный объект локальной переменнойself
, которая немедленно восстанавливается после этого. Вы должны либо установить состояние загруженного объектаself
, либо вернуть то, что вы загрузили.2. Ваш
load()
метод абсолютно ничего не делает. Он распаковывает сохраненные данные в локальную переменную, которая затем исчезает в конце функции. Чтобы заставить его работать, вам нужно вручную скопировать все атрибуты из загруженного объекта в оригиналself
. Обычным способом реализации подобной функциональности был бы статический или классовый метод, который возвращал загруженные данные.