2012-09-22 51 views
2

我有一個類,我將從JSON的行中實例化很多。例如:從JSON中加載類變量?

class Something: 
    def __init__(self, json): 
     #load all self variables from simplejson.loads(json) here 
     print self.some_variable_loaded_from_json 

我希望這樣做盡可能高效,因爲這個類每秒載入數百次。我知道我可以用simplejson生成的字典中的鍵/值對進行for循環,但是如果有一種方法可以讓simplejson直接加載到沒有O(n)開銷的類變量,那就太棒了。

+1

@DemianBrecht:只是不正​​確的 - 檢查我的答案中的例子:Python允許你用一個簡單的屬性assigment覆蓋你的實例變量爲'__dict__' – jsbueno

+0

@jsbueno:我錯了。出於某種原因,我認爲'__dict__''是隻讀的。 –

+0

@DemianBrecht - 一個類的'__dict__'確實是只讀的。也許這就是你爲什麼這麼想的原因。 – jsbueno

回答

8

如果你可以簡單的JSON數據加載到一個Python對象,只是通過你的相關的字典到__init__方法 - 在那裏,你可以簡單地在字典中傳遞的覆蓋您的實例__dict__

>>> import json 
>>> json_data = '{"a": "my data"}' 
>>> data = json.loads(json_data) 
>>> class AutoVar(object): 
... def __init__(self, data): 
...  self.__dict__ = data 
... 
>>> test = AutoVar(data) 
>>> test.a 
u'my data' 
+0

這是真棒和完美。 – Eli

1

您將不得不一次加載數據並將其緩存,或者在Something的每個實例上遍歷整個JSON blob。不幸的是,SimpleJson沒有維護「對象緩存」或類似的東西(Python中也沒有其他的JSON庫)。要從JSON blob中再次獲取數據,您必須重新解析blob本身(或文件,無論它是什麼)。

我可能會推薦的是您將這些變量從JSON添加到而不是每個實例,並且只在必要時。例如:

class Something(object): 
    @classmethod 
    def _load_from_json(cls, blob): 
     for k, v in blob.iteritems(): 
      setattr(cls, k, v) 

_load_from_json電話會議將是比較昂貴的,但你應該只需要做到這一點只要JSON本身的變化,再Something所有實例必須將數據屬性般的訪問。

在類似的說明中,如果您在這裏查看文件,我最近發表了一個要點,它允許對YAML文件進行類似實時對象的訪問(儘管您可以在碼)。它可能會做你想要的。

+0

不看文件,但願意看到的主旨無論如何。鏈接? – Eli

+0

哦,herp derp - 我的不好。忘記鏈接。這是它:https://gist.github.com/3298353 –