我正在使用gnosis.xml.pickle将我自己的类的对象转换为xml。初始化对象,以便:
self.logger = MyLogger()
但是当我将对象转储到字符串时,我得到一个异常,说明pickler遇到了一个不可解决的类型(thread.lock)。
有没有办法'标记'记录器属性,以便pickler知道不会尝试挑选该属性?
答案 0 :(得分:34)
您可以为您的班级定义两种方法__getstate__
和__setstate__
,以覆盖默认的酸洗行为。
http://docs.python.org/library/pickle.html#object.__getstate__
__getstate__
应返回您想要挑选的属性的字典。
def __getstate__(self):
d = dict(self.__dict__)
del d['logger']
return d
__setstate__
应使用提供的词典设置您的对象。
def __setstate__(self, d):
self.__dict__.update(d) # I *think* this is a safe way to do it
请注意,在取消播放时不会调用__init__
,因此您必须在__setstate__
答案 1 :(得分:8)
这可能是一个更好的解决方案,因为它允许通过copy.deepcopy
创建的对象仍然有self.logger
:
def __getstate__(self):
d = self.__dict__.copy()
if 'logger' in d:
d['logger'] = d['logger'].name
return d
def __setstate__(self, d):
if 'logger' in d:
d['logger'] = logging.getLogger(d['logger'])
self.__dict__.update(d)
答案 2 :(得分:3)
您的类可以实现特殊方法__getstate__
来准确返回它想要被腌制的实例的哪些部分。
有几种可能的变体(虽然__getstate__
及其可选的伴随方法__setstate__
是最常见的) - 请参阅我已经pickle
的在线Python文档页面上面指出,因为它是记录__getstate__
。