
2.7.10,在看pickle、copy_reg为缺失的属性提供默认值的时候遇到了一个问题,具体如下:GameState创建对象,并做序列化操作,保存到文件里。GameState类新增加了属性point,这里用copy_reg来注册相应的行为,再进行反序列化操作str,pickle实际调用的函数是一样的。找不到具体原因。求大神指点。# 对应第一步 class GameState(object): def __init__(self): self.level = 0 self.lives = 4 state = GameState() state.level += 1 state.lives -= 1 print state.__dict__ ''' {'lives': 3, 'level': 1} ''' import pickle state_path = './game_state.pickle' with open(state_path, 'wb') as f: pickle.dump(state, f) # 对应第二步 class GameState(object): def __init__(self, level=0, lives=4, point=0): self.level = level self.lives = lives self.point = point def pickle_obj(obj): kwargs = obj.__dict__ return unpickle_obj, (kwargs,) def unpickle_obj(kwargs): return GameState(**kwargs) import copy_reg copy_reg.pickle(GameState, pickle_obj) import pickle state_path = './game_state.pickle' with open(state_path, 'rb') as f: state_after = pickle.load(f) print state_after.__dict__ ''' {'lives': 3, 'level': 1} ''' 1 joeHuang OP 昨天在 Python3.6 下试了下也有一样的问题。 |
2 joeHuang OP 找到原因了。正确的使用方式应该是第一次创建类的时候,就进行注册。 ~~~python class GameState(object): def __init__(self): self.level = 0 self.lives = 4 def pickle_obj(obj): kwargs = obj.__dict__ return unpickle_obj, (kwargs,) def unpickle_obj(kwargs): return GameState(**kwargs) import copy_reg copy_reg.pickle(GameState, pickle_obj) state = GameState() state.level += 2 state.lives -= 3 print state.__dict__ ''' {'lives': 1, 'level': 2} '' import pickle state_path = './game_state_v2.pickle' with open(state_path, 'wb') as f: pickle.dump(state, f) class GameState(object): def __init__(self, level=0, lives=4, point=0): self.level = level self.lives = lives self.point = point with open(state_path, 'rb') as f: state_after = pickle.load(f) print state_after.__dict__ ''' {'point': 0, 'lives': 1, 'level': 2} ''' ~~~ |