我有一套類,我想序列化到/從JSON和MongoDB數據庫。我看到要做的最有效的方法是編寫方法來序列化爲字典,然後使用內置方法來存取數據。 (Q1:這個結論實際上是否有效,或者是否有更好的方法?)有沒有辦法通過自檢來獲取類構造函數參數?
所以,要將我的類的實例導出爲字典,我可以使用self。 字典。在我的情況下,這些類是嵌套的,所以它必須是遞歸的,很好。現在我想讀回來......但現在我被卡住了,如果我的類有一個不平凡的構造函數。試想一下:
class MyClass(object):
def __init__(self, name, value=None):
self.name = name
self._value = value
@property
def value(self):
return self._value
a = MyClass('spam', 42)
d = a.__dict__ #has {'name':'spam', '_value':42}
#now how to unserialize?
b = MyClass(**d) #nope, because '_value' is not a valid argument
c = MyClass(); c.__dict__.update(d) #nope, can't construct 'empty' MyClass
我不想寫,忽略未知參數的構造函數,因爲我不喜歡浪費時間想爲什麼一類是忽略了一些參數,發現有在名稱中一個錯字弄清楚。我不想刪除所需的參數,因爲這可能會導致其他地方出現問題。
那麼,如何解決我爲自己製造的這個混亂?
- 如果有辦法繞過類的構造函數,並創建一個空的 對象,可能的工作,但如果在
__init__
做任何有用的工作,我失去的。 (例如參數的類型/範圍檢查)。 - 在我的情況下,這些類在構造後不會改變(它們定義了很多有用的方法,並且有一些緩存)。所以,如果我能從字典中提取構造函數的參數,我會做得很好。有沒有辦法做到這一點,不涉及重複所有的構造函數參數?
你最好創建反序列化每種類型的工廠方法,這樣的類型擁有怎樣的實際控制構建對象。否則,你只是在外面,猜測黑盒子的類型是如何工作的,因爲你試圖填充正確的值。 - 想象一下,如果'value'屬性返回'self._value * 2'代替。 – poke
你打開這樣的黑客:http://ideone.com/R9T2Nd? –
@poke我不明白你評論的最後部分;只要屬性/方法不會改變任何屬性,爲什麼我會關心它們的序列化呢? – thegreatemu