2011-05-04 45 views
1

我需要对发生之前的pickle对象进行某种处理。更确切地说,对于某个基类的子类的实例,我希望完全不同的东西被代替,然后在加载时重新创建。遍历对象层次结构pickle风格

我知道__getstate__ & __setstate__但是,这是一个非常有创意的方法。我的理解是,这些是私人方法(以双下划线开头:__),因此会受到名称混乱的影响。因此,这将有效地迫使我为每一个想要受这种非标准行为约束的课程重新定义这两种方法。另外,我并不完全控制所有类的层次结构。

我想知道是否有某种简单的方法挂钩到酸洗过程中,并应用这种控制,__getstate____setstate__给予,但不必修改酸洗类。

好奇的一个侧面说明。这是一个使用Django和Celery的项目中的用例。 Django模型要么是不可取的,要么是非常不切实际和繁琐的。因此,更适合腌一对值为ID +模型类的对象。然而,有时并不是直接模拟的模型,而是模型字典,模型列表,模型列表列表以及名称。这迫使我写了大量我真正不喜欢的复制粘贴代码。对酸洗模型的需求来自Django-celery的设置,其中函数及其调用参数被安排在以后执行。不幸的是,在这些论点中,通常有很多模型混合在一些不平凡的层次结构中。

编辑

我有由芹菜用来指定自定义序列化的可能性,所以真的是能够建立在泡菜的顶部稍微修改串行毫不费力的问题。

回答

2

是被减少相关的唯一附加挂钩()和__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

不知道他们是否真的提供你所需要的特定。

+0

但是,这又要求我在其实例被酸洗的类上实现一些其他方法。所以这又是一种侵入性方法,还是我误解? – julkiewicz 2011-05-04 05:19:00

+0

然后你没有其他的选择在腌菜水平...案例关闭 – 2011-05-04 05:20:13

+0

好吧,你可以创建一个类层次结构,并让基类有这些额外的方法,一切都会从这个基类而不是对象下降? – anijhaw 2011-05-04 05:27:43