2011-06-13 98 views
3

我正在創建一系列對象實例,我使用它們的__dict__屬性保存和加載的屬性。我想保留__dict__之外的一些屬性,只是因爲我不希望它們被保存或加載。如何保持__dict__以外的屬性?

更具體地說:

我創建只是抱着孩子對象的列表父對象。子對象'__dict__被保存到文件並稍後加載以再次實例化它們。我希望子對象具有對父對象的引用,但我不希望將該引用保存到文件或從文件加載,因爲它沒有任何意義。

是否有任何語法會排除__dict__中的屬性?

PS:許多答案建議使用泡菜,我目前使用JSON保持數據的可讀性。

+0

我不確定這是可能的;是否有一個原因,你是以這種格式存儲數據,而不是像[pickle](http://docs.python.org/library/pickle.html)這樣的東西? (它可以配置爲排除某些屬性。) – 2011-06-13 10:43:53

+0

實際上,我使用的是[json](http://docs.python.org/library/json.html)。 – Benjamin 2011-06-13 10:53:13

回答

3

爲您不想保存的屬性添加一些前綴,並在保存時排除它們。

+0

是的,這是我的計劃B:我只是覺得它在保存的時候過濾不那麼幹淨。 – Benjamin 2011-06-13 10:56:08

+1

@Benjamin無論如何它可能不會乾淨。嘗試重新考慮你的架構。 – 2011-06-13 11:00:20

+0

我最終選擇了這個答案,因爲它是最簡單的。謝謝。 – Benjamin 2011-06-18 15:33:44

1

此方法不起作用,所以不會解決您的問題。您應該擴展您的框架以允許您指定從保存/加載中省略哪些屬性。

然而,你並沒有使用內置的持久化技術之一,例如,泡菜,已經提供這樣的功能。

1

如果您正在使用python pickle您可以創建兩個方法__getstate____setstate__,將允許您自定義屬性鹹菜,像這樣:

class Coordinate(object): 
    def __init__(self, x, y, z=0): 
     self.x, self.y, self.z = x, y, z 

    def __getstate__(self): 
     """By default if no __getstate__ was defined __dict__ will be pickle, but in 
     this case i don't want to pickle self.z attribute because of that this 
     method return a dict in the form {'x': ..., 'y': ...}. 

     """ 
     return { 
      "x": self.x, 
      "y": self.y, 
     } 

    def __setstate__(self, data): 
     self.__init__(data["x"], data["y"]) 
0

你可以重寫你的對象的__getattr____setattr__方法將您的屬性從__dict__中隱藏起來。但是你需要在其他地方存儲你的附加屬性。此外,它很難找出你的對象真正擁有哪些成員。因此,這不僅僅是一個好的解決方案。

相關問題