Если вы хотите, чтобы ваш класс обновлялся из сохраненного рассола ... вам, скорее всего, придется использовать __dict__.update
, как вы уже указали в своем ответе. Это похоже на то, как кошка гонится за хвостом, однако ... поскольку вы просите экземпляр по существу "перезагрузить" себя с прежним состоянием.
В вашем ответе есть небольшая настройка. Вы действительно можете засолить self
.
>>> import dill
>>> class Thing(object):
... def save(self):
... return dill.dumps(self)
... def load(self, obj):
... self.__dict__.update(dill.loads(obj).__dict__)
...
>>> t = Thing()
>>> t.x = 1
>>> _t = t.save()
>>> t.x = 2
>>> t.x
2
>>> t.load(_t)
>>> t.x
1
Я использовал loads
и dumps
вместо load
и dump
, потому что я хотел, чтобы соленье сохранялось в строку. Использование load
и dump
для файла также работает.
И, на самом деле, я могу использовать dill
для выделения экземпляра класса в файл для последующего использования ... даже если класс определяется интерактивно. Продолжая сверху ...
>>> with open('self.pik', 'w') as f:
... dill.dump(t, f)
...
>>>
затем остановка и перезапуск ...
Python 2.7.10 (default, May 25 2015, 13:16:30)
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> with open('self.pik', 'r') as f:
... t = dill.load(f)
...
>>> t.x
1
>>> print dill.source.getsource(t.__class__)
class Thing(object):
def save(self):
return dill.dumps(self)
def load(self, obj):
self.__dict__.update(dill.loads(obj).__dict__)
>>>
Я использую dill
, который доступен здесь: https://github.com/uqfoundation