如何在Python中阻止属性被pickle

2024-05-09 01:14:31 发布

您现在位置:Python中文网/ 问答频道 /正文

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

self.logger = MyLogger()

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

是否有方法“标记”logger属性以便pickler知道不尝试pickle该属性?


Tags: 对象方法字符串标记selflock类型属性
3条回答

您的类可以实现特殊方法^{},以准确返回它希望pickle的实例的哪些部分。

在这方面有几个可能的变体(尽管__getstate__及其可选的伴生方法__setstate__是最通用的)pickle请参见联机Python文档页,我已经在上面指出了,因为它是记录__getstate__的一个。

可以为类定义两个方法__getstate____setstate__,以覆盖默认的pickling行为。

^{}

__getstate__应该返回要pickle的属性的dict。

def __getstate__(self):
    d = dict(self.__dict__)
    del d['logger']
    return d

__setstate__应该使用提供的dict设置对象

def __setstate__(self, d):
    self.__dict__.update(d) # I *think* this is a safe way to do it

请注意,取消勾选时不会调用__init__,因此必须在__setstate__中创建记录器

这可能是一个更好的解决方案,因为它将允许通过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)

相关问题 更多 >