Python3 травит объект; его логический атрибут неправильно не выделен

#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 . Обычным способом реализации подобной функциональности был бы статический или классовый метод, который возвращал загруженные данные.