第七章:数据持久存储与交换-pickle:对象串行化-重构对象的问题

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,这一次运行会成功。
运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43193719/article/details/88773531