何為對象持久化?
我們需要設計大量的類,這些類又產生大量的實例對象。但是,它們創建的對象還不是真正的數據庫記錄。也就是說,如果我們關閉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