当前位置:
首页 > Python基础教程 >
-
Python3标准库:pickle对象串行化(2)
运行这个脚本时,会根据作为命令行参数给定的名字来创建一个文件。
通过简单的尝试加载而得到的pickled对象将会失败。
- import pickle
- with open('Test.py', '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,这一次运行会成功。在导入列表的最后增加了import语句后,现在脚本就能找到这个类并构造对象了。
- from demo import SimpleObject
现在允许修改后的脚本会生成期望的结果。
1.4 Unpicklable的对象
并不是所有对象都是可pickled的。套接字、文件句柄、数据库连接以及其他运行时状态依赖于操作系统或其他进程的对象,其可能无法用一种有意义的方式保存。如果对象包含不可pickled的属性,则可以定义__getstate__()和__setstate__()来返回所pickled实例的状态的一个子集。
__getstate__()方法必须返回一个对象,其中包含所pickled对象的内部状态。表示状态的一种便利方式是使用字典,不过值可以是任意的可pickled对象。保存状态,然后再从pickle加载对象时将所保存的状态传入__setstate__()。
- import pickle
- class State:
- def __init__(self, name):
- self.name = name
- def __repr__(self):
- return 'State({!r})'.format(self.__dict__)
- class MyClass:
- def __init__(self, name):
- print('MyClass.__init__({})'.format(name))
- self._set_name(name)
- def _set_name(self, name):
- self.name = name
- self.computed = name[::-1]
- def __repr__(self):
- return 'MyClass({!r}) (computed={!r})'.format(
- self.name, self.computed)
- def __getstate__(self):
- state = State(self.name)
- print('__getstate__ -> {!r}'.format(state))
- return state
- def __setstate__(self, state):
- print('__setstate__({!r})'.format(state))
- self._set_name(state.name)
- inst = MyClass('name here')
- print('Before:', inst)
- dumped = pickle.dumps(inst)
- reloaded = pickle.loads(dumped)
- print('After:', reloaded)
这个例子使用了一个单独的State对象来保存MyClass的内部状态。从pickle加载MyClass的一个实例时,会向__setstate__()传入一个State实例,用来初始化这个对象。
1.5 循环引用
pickle协议会自动处理对象之间的循环引用,所以复杂数据结构不需要任何特殊的处理。
- import pickle
- class Node:
- """A simple digraph
- """
- def __init__(self, name):
- self.name = name
- self.connections = []
- def add_edge(self, node):
- "Create an edge between this node and the other."
- self.connections.append(node)
- def __iter__(self):
- return iter(self.connections)
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式