【问题标题】:Storing serialized object in database then restoring object state from key将序列化对象存储在数据库中,然后从键恢复对象状态
【发布时间】:2011-07-06 13:02:26
【问题描述】:

好吧,这很有趣。

代码最能说明我的想法:

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() 中创建序列化对象的实例并一一复制值来完成。但这对于大型物体来说可能很乏味。

【问题讨论】:

  • 没有。你从 unpickling 中得到一个新鲜的、新的对象。你为什么要这样做?
  • +1 给 S.Lott - 阅读 python.net/~goodger/projects/pycon/2007/idiomatic/… 并三思而后行,为什么需要这样做以及出于什么目的。由于拾取将为您创建新实例,因此有任何理由添加将恢复您的初始对象的步骤。
  • “这是一个好奇的问题”并没有让一个令人困惑的问题突然变得清晰。神奇地恢复可变对象的想法非常非常令人困惑。请提供用例,以便我们理解问题,而不是声称它是“好奇心”。
  • 好吧,“这是一个好奇的问题”应该让您知道并非所有事物都有用例。有时只是“我想知道这是否可以做到”。这里就是这种情况。我喜欢将一个物体倒进另一个物体的概念。我问,希望也许,有机会,了解我还没有访问过的 Python 的阴暗区域。
  • @maligree:“并非所有事物都有用例”。那是假的。 “某种程度上将一个对象倒入另一个对象”听起来像是一个用例。这是一个非常糟糕的主意。但这听起来仍然像一个用例。请解释您要实现的目标。

标签: python python-3.x


【解决方案1】:

正如您在编辑中所说,创建一个新对象(显然不要分配给 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 

【讨论】:

    猜你喜欢
    • 2010-11-06
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多