我正在尝试理解以下主题并提出一些悬而未决的问题。任何人都可以帮助我吗?:
class MyObj(object):
def __init__(self, s):
self.s = s
def __repr__(self):
return '<MyObj(%s)>' % self.s
====================================
import json
import json_myobj
obj = json_myobj.MyObj('instance value goes here')
print 'First attempt'
try:
print json.dumps(obj)
except TypeError, err:
print 'ERROR:', err
def convert_to_builtin_type(obj):
print 'default(', repr(obj), ')'
# Convert objects to a dictionary of their representation
d = { '__class__':obj.__class__.__name__,
'__module__':obj.__module__,
}
d.update(obj.__dict__)
return d
print
print 'With default'
print json.dumps(obj, default=convert_to_builtin_type)
问题:以下代码的目的是什么?
d = { '__class__':obj.__class__.__name__,
'__module__':obj.__module__,
}
d.update(obj.__dict__)
答案 0 :(得分:0)
我认为理解这段代码片段需要了解两件事。
JSON是一种数据交换格式。特别是它是基于文本的,这意味着如果要将数据保存到文本文件中,则必须确定如何将数据表示为文本(序列化过程)。当然,从文本文件加载数据时,还需要确定如何将文本解析为内存结构(反序列化过程)。幸运的是,默认情况下,python的json
模块将处理大多数内置数据类型,例如标量类型,列表,字典等。但是对于您的情况,您已经创建了自己的数据类型,因此您必须指定如何序列化您自己的数据类型。这就是函数convert_to_builtin_type
的作用。
现在我们遇到了如何序列化自定义对象Myobj
的问题。这个问题没有统一的答案,但基线是您可以通过序列化文本恢复对象(反序列化)。在你的情况下:
d = { '__class__':obj.__class__.__name__,
'__module__':obj.__module__,
}
d.update(obj.__dict__)
obj.__dict__
是一个内置字典,用于存储obj
的属性。您可以阅读python文档Data Model来理解它。这里的目的是尝试提供足够的信息来恢复obj
。例如:
__class__=<c>
提供了班级的名称__module__=<m>
提供了查找课程的模块。s=<v>
提供Myobj.s
使用这三个,您可以恢复先前存储的对象。对于以__
开头的隐藏(内置)属性,您需要检查python文档。
希望这会有所帮助。