2011-07-06 10 views
3

まあ、これはかなり面白いです。データベースにシリアル化されたオブジェクトを格納してから、キーからオブジェクトの状態を復元する

コードを説明します最高の私が考えている:

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を前の状態に設定しましたが、驚くことはありません。

これは好奇心の質問です。

EDIT:明確な方法で問題を定式化するために:

は、同じタイプのシリアライズされたオブジェクトを使用して、その状態を復元しますオブジェクトを記述することが可能ですか?

実際には、restore()の内部にシリアル化されたオブジェクトのインスタンスを作成し、値を1つずつコピーすることでこれを行うことができます。しかし、これは大きなオブジェクトには面倒かもしれません。

+0

わからない...あなたがunpickle化から新鮮な、新しいオブジェクトを取得 – Randy

+1

号。なぜあなたはこれをやろうとしていますか? –

+1

+1にS.Lott - http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#id3を読んで、なぜこれを行う必要があり、どのような目的のために必要かを2回考えてください。ピッキングは新しいインスタンスを作成するので、初期オブジェクトを復元するステップを追加する理由はありません。 –

答えて

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 
関連する問題