好的,这很有趣。
代码将说明我正在考虑的最佳内容:
class Restorable(object):
def __init__(self, a=1, b=1):
self.a = a
self.b = b
def restore(self, serialized_object):
# I'm aware this is local, just illustrating
self = pickle.loads(serialized_object)
r = Restorable()
r.a = 1000
r.b = 2000
saved_state = pickle.dumps(r)
r.a = -1
r.b = -1
r.restore(pickle.dumps(saved_state)
# r.a should again be 1000
# r.b should again be 2000
这个想法是:可以说,pickle.dumps()
一个对象,将它存储在某个地方,修改真实对象,然后通过我安全存储的内容将其恢复到以前的状态?
我已经尝试了上面显示的代码,暂时将self
设置为之前的状态,但仅限于本地 - 嗯,这里并不奇怪。
这是一个好奇心问题。
编辑:以明确的方式提出问题:
是否可以使用相同类型的序列化对象编写一个可以恢复其状态的对象?
实际上,我看到这可以通过在restore()
中创建序列化对象的实例并逐个复制值来完成。但对于大型物体来说这可能是乏味的。
答案 0 :(得分:3)
正如您在编辑中所说,创建一个新对象(显然不要分配给self
),但不是逐个复制属性,而是
def restore(self, serialized_object):
original = pickle.loads(serialized_object)
self.__dict__.update(original.__dict__)
并立即更新所有属性。这是您的完整(重新设计)示例:
import pickle
class Restorable(object):
def __init__(self, a=1, b=1):
self.a = a
self.b = b
def restore(self, serialized_object):
original = pickle.loads(serialized_object)
self.__dict__.update(original.__dict__)
r = Restorable()
r.a = 1000
r.b = 2000
saved_state = pickle.dumps(r)
r.a = -1
r.b = -1
r.restore(saved_state)
print r.a, r.b