如何阻止属性在Python中被腌制

时间:2010-06-08 17:19:43

标签: python pickle

我正在使用gnosis.xml.pickle将我自己的类的对象转换为xml。初始化对象,以便:

self.logger = MyLogger()

但是当我将对象转储到字符串时,我得到一个异常,说明pickler遇到了一个不可解决的类型(thread.lock)。

有没有办法'标记'记录器属性,以便pickler知道不会尝试挑选该属性?

3 个答案:

答案 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__

的那个