我电脑的 python 是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}
'''