【问题标题】:Loading Class Variables from JSON?从 JSON 加载类变量?
【发布时间】:2012-09-14 10:24:45
【问题描述】:

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

【问题讨论】:

  • @DemianBrecht:不正确-检查我的答案中的示例:Python 允许您使用简单的属性分配覆盖您的实例变量 __dict__
  • @jsbueno:我错了。出于某种原因,我认为__dict__ 是只读的。
  • @DemianBrecht - 一个类的 __dict__ 确实是只读的。也许这就是你这么认为的原因。

标签: python json python-2.7


【解决方案1】:

您将不得不加载数据一次并保持缓存,或者在 Something 的每个实例化上循环遍历整个 JSON blob。不幸的是,SimpleJson 没有维护“对象缓存”或类似的东西(Python 中的任何其他 JSON 库也没有)。要再次从 JSON blob 中获取数据,您必须重新解析 blob 本身(或文件,无论它是什么)。

我可能会建议您将这些变量从 JSON 添加到 class 而不是每个实例,并且仅在必要时添加。例如:

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 换成 @987654327 @ 在代码中)。它可能会满足您的需求。

【讨论】:

  • 不看文件,但无论如何都希望看到要点。链接?
  • 哦,疱疹病毒 - 我的错。忘记链接了。这是:gist.github.com/3298353
【解决方案2】:

如果您只是将 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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-11
    • 2011-07-22
    • 1970-01-01
    • 2017-12-21
    • 2023-03-14
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    相关资源
    最近更新 更多