2017-07-13 66 views
0

我有一套類,我想序列化到/從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__做任何有用的工作,我失去的。 (例如參數的類型/範圍檢查)。
  • 在我的情況下,這些類在構造後不會改變(它們定義了很多有用的方法,並且有一些緩存)。所以,如果我能從字典中提取構造函數的參數,我會做得很好。有沒有辦法做到這一點,不涉及重複所有的構造函數參數?
+0

你最好創建反序列化每種類型的工廠方法,這樣的類型擁有怎樣的實際控制構建對象。否則,你只是在外面,猜測黑盒子的類型是如何工作的,因爲你試圖填充正確的值。 - 想象一下,如果'value'屬性返回'self._value * 2'代替。 – poke

+1

你打開這樣的黑客:http://ideone.com/R9T2Nd? –

+0

@poke我不明白你評論的最後部分;只要屬性/方法不會改變任何屬性,爲什麼我會關心它們的序列化呢? – thegreatemu

回答

0

我不知道這只是一個微不足道的例子,但我看不到屬性value(沒有雙關語意圖)的價值。如果你直接從__init__分配值參數,我的意思是。在這種情況下,只需使用簡單的屬性即可解決您的問題。

但是,如果由於某種原因,你真正需要的屬性只是剝奪關鍵中的破折號:

class MyClass(object): 
    Pdef __init__(self, name, value=None): 
     self.name = name 
     self._value = value 
    @property 
    def value(self): 
     return self._value 

a = MyClass('spam', 42) 
d = {k.strip('_'): v for k, v in a.__dict__.items()} 
b = MyClass(**d) 
+0

這裏的值確實是一個微不足道的例子,儘管這個例子給出了一些有用的「只讀」屬性。主要觀點是構造函數參數不能直接映射到具有相同名稱的「公共」屬性上。過濾下劃線的訣竅可能對我所做的事很簡單 – thegreatemu

相關問題