我有一个嵌套类:
类小部件类型(对象):
类浮动类型(对象):
经过
类文本类型(对象):
经过
..和一个引用嵌套类类型(不是它的实例)的对象,就像这样
类 ObjectToPickle(对象):
def __init__(自我):
self.type = WidgetType.TextType
尝试序列化 ObjectToPickle 类的实例会导致:
_PicklingError:无法腌制
_
有没有办法在 python 中腌制嵌套类?
原文由 prinzdezibel 发布,翻译遵循 CC BY-SA 4.0 许可协议
我知道这是一个 非常 古老的问题,但除了重新构建代码的明显且最有可能正确的答案之外,我从未明确地看到过这个问题的令人满意的解决方案。
不幸的是,这样做并不 总是 可行的,在这种情况下,作为最后的手段,可以选择在另一个类中定义的类的实例。
__reduce__
函数 的 python 文档声明您可以返回因此,您所需要的只是一个可以返回适当类实例的对象。这个类本身 必须 是可腌制的(因此,必须存在于
__main__
级别),并且可以简单如下:因此,剩下的就是在 FloatType 的
__reduce__
方法中返回适当的参数:结果是一个嵌套的类,但实例可以被腌制(需要进一步的工作来转储/加载
__state__
信息,但根据__reduce__
文档,这相对简单)。同样的技术(稍微修改一下代码)可以应用于深度嵌套的类。
一个完整的例子:
我对此的最后一点是记住其他答案所说的话: