2012-09-27 15 views
16

Tôi có các lớp:Python, override__getstate __() và __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) 

Và tôi muốn dưa "gia đình" đối tượng. vì vậy tôi cần ghi đè các lớp học __getstate____setstate__ "Gia đình" và "Cha".

Bạn có thể chỉ cho tôi cách hiệu quả để thực hiện việc này không. (lý do tại sao tôi sử dụng __slots__ là vì tôi có nhiều đối tượng và tôi cố gắng tiết kiệm bộ nhớ)

Trả lời

19

__getstate__ phải trả về một đối tượng có thể chọn (chẳng hạn như một bộ) với đủ thông tin để tạo lại cá thể.

__setstate__ sẽ nhận được cùng một đối tượng và sử dụng nó để định cấu hình lại cá thể.

Ví dụ:

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: Cảm ơn đã sửa. – unutbu