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