何为对象持久化?
我们需要设计大量的类,这些类又产生大量的实例对象。但是,它们创建的对象还不是真正的数据库记录。也就是说,如果我们关闭Python,实例也将消失——它们是内存中的临时性对象,而没有存储到文件这样的更为持久的媒介中,因此,未来程序运行的时候,它们不再可用。事实证明,让实例对象更加持久是很容易做到的,使用Python一项叫做对象持久化的功能——让对象在创建它们的程序退出之后依然存在。
python中自带的对象持久化标准库
对象持久化通过3个标准的库模块来实现,这3个模块在Python中都可用:
pickle
任意Python对象和字节串之间的序列化,pickle模块几乎可以处理我们所能够创建的任何对象,包括列表、字典、嵌套组合以及类实例。
dbm
实现一个可通过键访问的文件系统,以存储字符串
shelve
使用另两个模块按照键把Python对象存储到一个文件中。shelve模块提供了一个额外的层结构,允许按照键来存储pickle处理后的对象。Shelve使用pickle把一个对象转换为其pickle化的字符串,并将其存储在一个dbm文件中的键之下;随后载入的时候,shelve通过键获取pickle化的字符串,并用pickle在内存中重新创建最初的对象。
实例
我们直接导入shelve模块,用一个外部文件名打开一个新的shelve,把对象赋给shelve中的键,当我们操作完毕之后关闭这个shelve,因为已经做过了修改:
<code>shelve_store
.py
/<code>
<code>/<code>
<code>from
personimport
Person,Manager/<code>
<code>bob
=Person('Bob Smith'
)/<code>
<code>sue
=Person("Sue Jones"
,job="dev"
,pay=100000
)/<code>
<code>tom
=Manager('Tom Jones'
,50000
)/<code>
<code>import
shelve/<code>
<code>a_db
=shelve.open('persondb'
) /<code>
<code>for
object
in
(bob,sue,tom
): /<code>
<code> a_db[object
.name]=object
/<code>
<code>a_db.close() /<code>
<code>/<code>
<code>a_db
=shelve.open('persondb'
) /<code>
<code>list
(a_db.keys())) /<code>
<code>bob
=a_db['Bob Smith'
] /<code>
<code>
<code>a_db
.close
()/<code>
<code>/<code>
<code>a_db
=shelve.open('persondb'
)/<code>
<code>sue
=a_db['persondb'
]/<code>
<code>sue
.giveRaise
(0.1
)/<code>
<code>a_db['persondb'
]=sue/<code>
<code>a_db
.close
()shelve_store
.py
/<code>
<code>/<code>
<code>from
personimport
Person,Manager/<code>
<code>bob
=Person('Bob Smith'
)/<code>
<code>sue
=Person("Sue Jones"
,job="dev"
,pay=100000
)/<code>
<code>tom
=Manager('Tom Jones'
,50000
)/<code>
<code>import
shelve/<code>
<code>a_db
=shelve.open('persondb'
) /<code>
<code>for
object
in
(bob,sue,tom
): /<code>
<code> a_db[object
.name]=object
/<code>
<code>a_db
.close
()#Close
after
making
changes
/<code>
<code>read
pyc files /<code>
<code>a_db
=shelve.open('persondb'
) /<code>
<code>len
(a_db),list(a_db.keys()))/<code>
<code>bob
=a_db['Bob Smith'
] /<code>
<code>
<code>a_db
.close
()/<code>
<code>/<code>
<code>sue
=a_db['persondb'
]/<code>
<code>sue
.giveRaise
(0.1
)/<code>
<code>sue
.giveRaise
(0.1
)/<code>
<code>a_db['p
/<code>
<code>a_db
.close
(/<code>
注意我们是如何把对象的名字用做键,从而把它们赋给shelve的。这么做只是为了方便,在shelve中,键可以是任何的字符串,包括我们使用诸如处理ID和时间戳(可以在os中和time标准库模块中使用)的工具所创建的唯一的字符串。唯一的规则是,键必须是字符串并且应该是唯一的,这样,我们就可以针对每个键只存储一个对象。
附:person.py