我需要对在它发生之前进行酸洗的对象进行某种处理。更准确地说,对于某个基类的子类的实例,我想要一些完全不同的东西,而不是被腌制,然后在加载时重新创建。
我知道__getstate__
& __setstate__
但这是一种非常有创意的方法。我的理解是这些是私有方法(以双下划线开头:__
),因此受到名称修改的影响。因此,这有效地迫使我为每个我希望受这种非标准行为约束的类重新定义这两种方法。另外,我并没有完全控制所有类的层次结构。
我想知道是否有某种简短的方法来勾选酸洗过程并应用__getstate__
和__setstate__
给出的这种控制,但不必修改这样的酸洗类。< / p>
好奇的旁注。这是一个使用Django和Celery的项目的用例。 Django模型要么不可用,要么非常不实用,而且很难腌制。因此,更可取的是选择ID +模型类的值对。然而,有时它不是直接被腌制的模型,而是模型字典,模型列表,模型列表列表,您可以命名。这迫使我写了很多我真的不喜欢的复制粘贴代码。需要酸洗模型来自Django-celery设置,其中函数及其调用参数被安排在以后执行。不幸的是,在这些论点中,通常有很多模型混合在一些非平凡的层次结构中。
修改
我确实有可能指定Celery使用的自定义序列化程序,所以这是一个能够在不费力的情况下在pickle之上构建一个稍微修改过的序列化程序的问题。
答案 0 :(得分:2)
唯一相关的钩子是 reduce ()和__reduce__ex()
http://docs.python.org/library/pickle.html
What is the difference between __reduce__ and __reduce_ex__?
Python: Ensuring my class gets pickled only with the latest protocol
不确定他们是否真的提供了你特别需要的东西。