標籤:
1.對象持久化
如果希望透明地儲存 Python 對象,而不丟失其身份和類型等資訊,則需要某種形式的對象序列化:
它是一個將任意複雜的對象轉成對象的文本或二進位表示的過程。同樣,必須能夠將對象經過序列化後的形式恢複到原有的對象。
在 Python 中,這種序列化過程稱為 pickle,可以將對象 pickle 成字串、磁碟上的檔案或者任何類似於檔案的對象,也可以將這些字串、檔案或任何類似於檔案的對象 unpickle 成原來的對象。
2. Pickle模組
pickle模組就是實現了這樣功能的一個模組,代碼如下:
In [3]: import cPickle as pickleIn [4]: a1=[‘apple‘,‘banana‘,‘orange‘]In [5]: b1={‘one‘:1,‘two‘:2,‘three‘:3}In [6]: f=open(‘temp.pkl‘,‘wb‘)In [7]: pickle.dump(a1,f)In [8]: pickle.dump(b1,f)In [9]: f.close()In [10]: f2 = file(‘temp.pkl‘,‘rb‘)In [11]: recover1 = pickle.load(f2)In [12]: print recover1[‘apple‘, ‘banana‘, ‘orange‘]In [13]: recover2 = pickle.load(f2)In [14]: print recover2{‘one‘: 1, ‘three‘: 3, ‘two‘: 2}In [15]: f2.close()
3. ZODB
pickle 模組可以提供這些好處,但有時可能需要比這種簡單的 pickle 檔案更健壯以及更具有延展性的事物。
例如,只用 pickle 不能解決命名和尋找 pickle 檔案這樣的問題,另外,它也不能支援並發地訪問持久性對象。如果需要這些方面的功能,則要求助類似於 ZODB(針對 Python 的 Z 對象資料庫)這類資料庫。
ZODB (Zope Object Database)是一個健壯的、多使用者的和物件導向的資料庫系統,它能夠儲存和管理任意複雜的 Python 對象,並支援事務操作和並發控制。
以下是一個類比銀行存款取款的小例子,使用ZODB來進行儲存
customer.py 一個繼承Persistent的Account類
import persistentclass OutOfFunds(Exception): passclass Account(persistent.Persistent): def __init__(self,name,start_balance=0): self.name = name self.balance = start_balance def __str__(self): return "Account: %s, balance: %s" %(self.name,self.balance) def __repr__(self): return "Account: %s, balance: %s" %(self.name,self.balance) def deposit(self,amount): """save amount into balance""" self.balance += amount def withdraw(self,amount): """withdraw from balance""" if amount > self.balance: raise OutOfFunds self.balance -= amount return self.balance
類比銀行存款取款 zodb_customer_app.py
import ZODBimport ZODB.FileStorage as ZFSimport transactionimport customerclass ZODBUtils: conn = None filestorage = None def openConnection(self,file_name): self.filestorage = ZFS.FileStorage(file_name) db = ZODB.DB(self.filestorage) self.conn = db.open() return self.conn def closeConnection(self): self.conn.close() self.filestorage.close()def init_balance(): zodbutils = ZODBUtils() conn = zodbutils.openConnection(‘zodb_filestorage.db‘) root = conn.root() noah = customer.Account(‘noah‘,1000) print noah root[‘noah‘] = noah jermy = customer.Account(‘jermy‘,2000) print jermy root[‘jermy‘] = jermy transaction.commit() zodbutils.closeConnection()def app(): zodbutils = ZODBUtils() conn = zodbutils.openConnection(‘zodb_filestorage.db‘) root = conn.root() noah = root[‘noah‘] print "Before Deposit Or Withdraw" print "=" * 30 print noah jermy = root[‘jermy‘] print jermy print ‘-‘ * 30 transaction.begin() noah.deposit(300) jermy.withdraw(300) transaction.commit() print "After Deposit Or Withdraw" print "=" * 30 print noah print jermy print "-" * 30 zodbutils.closeConnection()if __name__ == ‘__main__‘: # init_balance() app()
運行結果如下:
Python 持久化管理之 Pickle/ZODB