Python 对象持久化简介

何为对象持久化?

我们需要设计大量的类,这些类又产生大量的实例对象。但是,它们创建的对象还不是真正的数据库记录。也就是说,如果我们关闭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

person

import

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>

print

(len(a_db),

list

(a_db.keys())) /<code>
<code>

bob

=a_db[

'Bob Smith'

] /<code>
<code>

print

(bob)/<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

person

import

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>

print

(

len

(a_db),list(a_db.keys()))/<code>
<code>

bob

=a_db[

'Bob Smith'

] /<code>
<code>

print

(bob)/<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


Python 对象持久化简介


分享到:


相關文章: