2

我有一个类,我将从 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) 开销,那就太棒了。

4

2 回答 2

9

如果您只是将 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'
于 2012-09-22T02:25:53.233 回答
2

您将不得不加载数据一次并保持缓存,或者在Something. 不幸的是,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 文件进行实时类似对象的访问(尽管您实际上可以在代码中换掉yamljson。它可能会做你正在寻找的东西。

于 2012-09-22T01:39:01.650 回答