我有一个类,我将从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)开销的类变量,那就太棒了。
答案 0 :(得分: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'
答案 1 :(得分:2)
您将不得不加载一次数据并保持缓存,或者在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文件进行实时对象访问的要点(尽管您实际上可以换出yaml
代码中的json
)。它可能会做你想要的。