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