由於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
>>>