2012-09-27 4 views
16

私が持っているこれらのクラス:のPython、override__getstateの__()と__setstateの__()

class Family(object): 
    __slot__ = ['father', 'var1'] 
    def __init__(self, father, var1 = 1): 
     self.father, self.var1 = father var1 

class Father(object): 
    __slots__ = ['var2'] 
    def __init__(self, var2 = ''): 
     self.var2 = var2 

father = Father() 
family = Family(father = father) 

と私は "家族" オブジェクトをpickle化したいです。だから私は__getstate____setstate__ "ファミリー"と "父"クラスをオーバーライドする必要があります。

これを行う効率的な方法を教えてもらえますか? (私はオブジェクトがたくさんあると私はメモリを節約しようとしていますので、私は__slots__を使用する理由がある)

答えて

19

__getstate__は、インスタンスを再構築するために十分な情報を(例えばタプルなど)pickle化可能なオブジェクトを返す必要があります。

__setstate__は同じオブジェクトを受信し、それを使用してインスタンスを再設定する必要があります。例えば

import cPickle as pickle 

class Family(object): 
    __slots__ = ['father', 'var1'] 
    def __init__(self, father, var1 = 1): 
     self.father, self.var1 = father, var1 
    def __getstate__(self): 
     return self.father, self.var1 
    def __setstate__(self, state): 
     self.father, self.var1 = state 

foo = Family('father',1) 
foo.var1 = 2 
foo_pickled = pickle.dumps(foo) 
foo2 = pickle.loads(foo_pickled) 
print(repr(foo2)) 
# <__main__.Family object at 0xb77037ec> 

print(foo2.var1) 
# 2 
+0

@DSM:編集してくれてありがとう。 – unutbu