当类中含有logging等流数据时,使用pickle打包与装载类对象数据

本文探讨了在使用pickle进行对象打包时遇到的冲突问题,特别是当对象包含logging模块时的情况。通过手工重写类的__getstate__和__setstate__函数,实现对象的完整打包与后期恢复,同时保持日志输出的便利性。

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


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值