7.1.3 重构对象的问题
处理定制类时,腌制的类必须出现在读取pickle的进程所在的命名空间里。只会腌制这个实例的数据,而不是类定义,类名用于查找构造函数,以便在解除腌制时创建新对象。下面这个例子将一个类的实例写至一个文件。
# pickle_dump_to_file_1.py
import pickle
import sys
class SimpleObject:
def __init__(self,name):
self.name = name
l = list(name)
l.reverse()
self.name_backwards = ''.join(l)
if __name__ == '__main__':
data = []
data.append(SimpleObject('pickle'))
data.append(SimpleObject('preserve'))
data.append(SimpleObject('last'))
filename = sys.argv[1]
with open(filename,'wb') as out_s:
for o in data:
print('WRITING: {} ({})'.format(
o.name,o.name_backwards))
pickle.dump(o,out_s)
运行这个脚本时,会根据作为命令行参数给定的名字来创建一个文件。
通过简单地尝试加载而得到的腌制对象将会失败。
import pickle
import pprint
import sys
# from pickle_dump_to_file_1 import SimpleObject # 修正脚本时使用
filename = sys.argv[1]
with open(filename,'rb') as in_s:
while True:
try:
o = pickle.load(in_s)
except EOFError:
break
else:
print('READ: {} ({})'.format(
o.name,o.name_backwards))
这个版本失败的原因在于并没有SimpleObject类。
运行结果:
修正后的版本从原脚本导入了SimpleObject,这一次运行会成功。
运行结果: