2011-05-04 43 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