2012-09-27 10 views
16

mam tych klas:Python, override__getstate __() i __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) 

i chcę marynowane "rodzina" obiektu. więc muszę zastąpić __getstate__ i __setstate__ klas "Rodzina" i "Ojciec".

Czy możesz pokazać mi skuteczny sposób robienia tego. (dlatego używam __slots__ jest, bo mam wiele obiektów i usiłuję zapisać pamięć)

Odpowiedz

19

__getstate__ powinien zwrócić picklable obiekt (taki jak krotki) z wystarczającą ilością informacji, aby zrekonstruować instancji.

__setstate__ powinien oczekiwać otrzymania tego samego obiektu i użyć go do ponownej konfiguracji instancji.

Na przykład:

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: Dzięki za edycję. – unutbu