2024-05-09 01:14:31 发布
网友
我正在使用gnosis.xml.pickle将自己类的对象转换为xml。对象已初始化,以便:
self.logger = MyLogger()
但是,当我将对象转储到字符串时,会出现一个异常,说明pickler遇到了一个不可访问的类型(thread.lock)。
是否有方法“标记”logger属性以便pickler知道不尝试pickle该属性?
您的类可以实现特殊方法^{},以准确返回它希望pickle的实例的哪些部分。
在这方面有几个可能的变体(尽管__getstate__及其可选的伴生方法__setstate__是最通用的)pickle请参见联机Python文档页,我已经在上面指出了,因为它是记录__getstate__的一个。
__getstate__
__setstate__
pickle
可以为类定义两个方法__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__中创建记录器
__init__
这可能是一个更好的解决方案,因为它将允许通过copy.deepcopy创建的对象仍然具有self.logger:
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)
您的类可以实现特殊方法^{} ,以准确返回它希望pickle的实例的哪些部分。
在这方面有几个可能的变体(尽管
__getstate__
及其可选的伴生方法__setstate__
是最通用的)pickle
请参见联机Python文档页,我已经在上面指出了,因为它是记录__getstate__
的一个。可以为类定义两个方法
__getstate__
和__setstate__
,以覆盖默认的pickling行为。^{}
__getstate__
应该返回要pickle的属性的dict。__setstate__
应该使用提供的dict设置对象请注意,取消勾选时不会调用
__init__
,因此必须在__setstate__
中创建记录器这可能是一个更好的解决方案,因为它将允许通过
copy.deepcopy
创建的对象仍然具有self.logger
:相关问题 更多 >
编程相关推荐