如何在python中用dict生成对象?
我目前有一个dict,其中:如何在python中用dict生成对象?,python,django,Python,Django,我目前有一个dict,其中: one_result = {'name':'Acme', 'description': 'Fun time', 'results': {'fun_status': 'Extra', 'fun_title': 'Foo' } } 我在代码中的许多地方访问此dict的值,并将许多结果放入数组并存储在DB中: class Record(models.Model): results = JSONField(d
one_result = {'name':'Acme', 'description': 'Fun time',
'results': {'fun_status': 'Extra', 'fun_title': 'Foo' }
}
我在代码中的许多地方访问此dict的值,并将许多结果放入数组并存储在DB中:
class Record(models.Model):
results = JSONField(default=[], null=True, blank=True)
我希望保持干燥,并从结果中生成Python对象,这样我就可以直接访问属性,而不是通过键名称:
result.name与result['name']
有没有一种方法可以让我创建一个由dict()支持的对象,并在我的数据库中轻松地序列化/反序列化为JSON?一个简单的解决方案是直接添加到
self.\uuuuuu dict\uu
:
class Foo():
def __init__(self, d):
for k, i in d.items():
if isinstance(i, dict):
self.__dict__[k] = Foo(i)
else:
self.__dict__[k] = i
测试用例:
f = Foo({"a": "b", "c": {"d": "e"}, "f": ["g", "h", "i"]})
f.a
# 'b'
f.c
# <__main__.Foo at 0x1624c5c0>
f.c.d
# 'e'
f.f
# ['g', 'h', 'i']
f=Foo({“a”:“b”,“c”:{“d”:“e”},f”:[“g”,“h”,“i”]})
f、 a
#“b”
f、 c
#
f、 c.d
#“e”
f、 f
#['g'、'h'、'i']
一个简单的解决方案是直接向自我添加
class Foo():
def __init__(self, d):
for k, i in d.items():
if isinstance(i, dict):
self.__dict__[k] = Foo(i)
else:
self.__dict__[k] = i
测试用例:
f = Foo({"a": "b", "c": {"d": "e"}, "f": ["g", "h", "i"]})
f.a
# 'b'
f.c
# <__main__.Foo at 0x1624c5c0>
f.c.d
# 'e'
f.f
# ['g', 'h', 'i']
f=Foo({“a”:“b”,“c”:{“d”:“e”},f”:[“g”,“h”,“i”]})
f、 a
#“b”
f、 c
#
f、 c.d
#“e”
f、 f
#['g'、'h'、'i']
将数据保存为JSON字段是否有特殊原因?是否有可能重复将数据保存为JSON字段的特殊原因?是否有可能重复setattr(k,i)
或setattr(k,Foo(i))
比直接使用\uu dict\uuu
更可取,在我看来,@peterdegloper我倾向于同意,只是因为它对我来说更易读,但我没有足够的知识来区分利弊。如果您能提供详细建议,我们将不胜感激。基本上只是标准化和封装。使用setattr
你永远不必担心你调用它的东西是否有自定义属性行为-setattr(some对象,“some属性名”,some val)
可靠地做着与some对象完全相同的事情。some属性名=some\val
setattr(k,i)
或setattr(k,Foo(i))
比直接与IMO的\uu dict\uuu
合作更好。@peterdegloper我倾向于同意,只是因为它对我来说更具可读性,但我没有足够的知识来区分利弊。如果您能提供详细建议,我们将不胜感激。基本上只是标准化和封装。使用setattr
您不必担心调用它的对象是否具有自定义属性行为-setattr(一些对象,“一些属性名”,一些值)
可靠地执行与一些对象完全相同的操作。一些属性名=一些值
。