__getstate_manages_dict__ 是做什么的?

what does __getstate_manages_dict__ do?

我一直在研究多处理和 C++ 扩展,但我不太了解 __getstate_manages_dict__ 函数(我知道如何使用它,但我不太确定它是如何工作的)。 boost/Python documentation for pickle support 是这样说的:

The author of a Boost.Python extension class might provide a __getstate__ method without considering the possibilities that: * his class is used in Python as a base class. Most likely the dict of instances of the derived class needs to be pickled in order to restore the instances correctly. * the user adds items to the instance's __dict__ directly. Again, the __dict__ of the instance then needs to be pickled.

To alert the user to this highly unobvious problem, a safety guard is provided. If __getstate__ is defined and the instance's __dict__ is not empty, Boost.Python tests if the class has an attribute __getstate_manages_dict__. An exception is raised if this attribute is not defined:

我见过一些示例,其中对象的 __dict____getstate__ 中返回,然后在 __setstate__ 中更新。 __dict__ 指的是什么?它是派生的 class 对象的 __dict__ 属性吗?另外,如果 pickle 调用 __init__ 创建一个新对象然后设置属性,为什么需要显式处理这个字典?

谢谢

I know how to use it, but I'm not really sure how it works

这是一个布尔值,默认为 False。重点是向 Boost 发出信号,表明 __getstate__/__setstate__ 实现处理 class' __dict__ 属性,这样信息就不会在酸洗过程中丢失。

这个想法是 Boost::Python 实际上无法确定代码是否正确编写,因此您需要跳过这个额外的障碍,这样,如果您没有意识到问题所在,您会看到错误消息 - 正如他们所说,to alert the user to this highly unobvious problem.

它没有做任何神奇的事情。它只是为了确认您“阅读了保修”,可以这么说。

The boost/Python documentation for pickle support says this:

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

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

What is this __dict__ referring to? Is it the __dict__ attribute of the derived class object?

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

Also, why does this dict needs to be handled explicitly if pickle calls init to create a new object and then sets the attribute?

见上文。当您 获取 属性(以便可以写入 pickle 文件)时,您需要确保您确实获取了所有必要的属性,否则它们将在恢复时丢失。硬编码逻辑可能会遗漏一些。