我一直在处理多处理和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呢?
谢谢
发布于 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呢?
请参见上面的。当您获得属性(以便可以写入泡菜文件)时,您需要确保实际获得所有必要的属性,否则它们在恢复时会丢失。硬编码逻辑可能会漏掉一些。
https://stackoverflow.com/questions/63039288
复制相似问题