首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__getstate_manages_dict__是做什么的?

__getstate_manages_dict__是做什么的?
EN

Stack Overflow用户
提问于 2020-07-22 16:48:50
回答 1查看 221关注 0票数 0

我一直在处理多处理和C++扩展,我不太了解__getstate_manages_dict__函数(我知道如何使用它,但我不太确定它是如何工作的)。用于泡菜支持的boost/Python文档说:

Boost.Python扩展类的作者可能提供一个__getstate__方法,而不考虑在Python中使用他的类作为基类的可能性。很可能,需要对派生类实例的dict进行筛选,以便正确恢复实例。*用户直接将项添加到实例的__dict__中。同样,需要对实例的__dict__进行腌制。为了提醒用户注意这个非常不明显的问题,我们提供了一个安全防护装置。如果定义了__getstate__,且实例的__dict__不是空的,则Boost.Python将测试该类是否具有属性__getstate_manages_dict__。如果未定义此属性,则会引发异常:

我看到了一些示例,其中对象的__dict____getstate__中返回,然后在__setstate__中更新。这个__dict__指的是什么?它是派生类对象的__dict__属性吗?另外,如果泡菜调用__init__创建一个新对象,然后设置属性,为什么需要显式地处理这个dict呢?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-22 17:08:51

我知道如何使用它,但我不太确定它是如何工作的

它是一个默认为False的布尔值。关键是要发出信号,以增强__getstate__/__setstate__实现处理类的__dict__属性,这样信息就不会在泡菜过程中丢失。

它的思想是:Python实际上无法确定代码编写是否正确,因此您必须跳过这个额外的障碍,这样,如果您不知道这个问题,就会看到一个错误消息--就像他们所说的,to alert the user to this highly unobvious problem

这没什么神奇的东西。它只是为了确认你“读了保修”,可以这么说。

用于泡菜支持的boost/Python文档说明如下:

这只是解释了为什么考虑__dict__内容很重要的原因--即使您不想选择在__init__中显式设置的所有属性(例如,该类包含对要以其他方式加载的大型资源的引用,或者结果缓存,或者.)。简而言之,类的实例可能包含您不希望它们包含的信息,并且您的__getstate__实现不知道如何处理,除非它考虑到实例的__dict__

因此,提供了“实用建议”:“如果需要__getstate__,则在返回的Python对象中包含实例的__dict__。”

这个__dict__指的是什么?它是派生类对象的__dict__属性吗?

它是调用__dict__的实例的__getstate__属性。如果派生类不覆盖方法,则可能是派生类的实例。或者它可能是基类的一个实例,它可能有也可能没有在类实现之外添加额外的属性。

另外,如果泡菜调用init来创建一个新对象,然后设置属性,那么为什么需要显式地处理这个dict呢?

请参见上面的。当您获得属性(以便可以写入泡菜文件)时,您需要确保实际获得所有必要的属性,否则它们在恢复时会丢失。硬编码逻辑可能会漏掉一些。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63039288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档