當類中含有logging等流數據時,使用pickle打包與裝載類對象數據

由於pickle打包不允許對象中有流數據,所以,如果待打包的類對象中含有logging的對象時,打包不會成功。但是在類中添加logging對象來輸出日誌比較方便實用,那麼如何解決這種衝突呢?需要手工重寫自己的類的__getstate__和__setstate__函數,在__getstate__函數中,返回一個不含有流數據變量的字典,這樣就可以打包,在日後裝載數據後,再手工在__dict__中添加該變量,即完美恢復類對象。以下是在IDE中寫的簡單的示例,在打包時刪除類變量a,在後來裝載數據後再手工添加類變量a。

>>> class a(object):
	def __init__(self):
		self.b = 1
		self.d = 2
	def c(self):
		print "here"
	def __getstate__(self):
		odict = self.__dict__.copy()
		del odict["b"]
		return odict
	def __setstat__(self, dict):
		self.__dict__.update(dict)

		
>>> m = a()
>>> m.b
1
>>> m.d
2
>>> import pickle
>>> pfile = open(r"d:\1.dat", "w")
>>> pickle.dump(m, pfile)
>>> pfile.close()
>>> pfile = open(r"d:\1.dat", "r")
>>> o = pickle.load(pfile)
>>> pfile.close()
>>> o.b

Traceback (most recent call last):
  File "<pyshell#32>", line 1, in <module>
    o.b
AttributeError: 'a' object has no attribute 'b'
>>> o.d
2
>>> o.__dict__["b"] = 1
>>> o.b
1
>>> 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章