使用自己的类型 - Python

时间:2017-09-26 17:54:56

标签: python json

我正在尝试理解以下主题并提出一些悬而未决的问题。任何人都可以帮助我吗?:

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__)

1 个答案:

答案 0 :(得分:0)

我认为理解这段代码片段需要了解两件事。

  1. JSON序列化和反序列化。
  2. JSON是一种数据交换格式。特别是它是基于文本的,这意味着如果要将数据保存到文本文件中,则必须确定如何将数据表示为文本(序列化过程)。当然,从文本文件加载数据时,还需要确定如何将文本解析为内存结构(反序列化过程)。幸运的是,默认情况下,python的json模块将处理大多数内置数据类型,例如标量类型,列表,字典等。但是对于您的情况,您已经创建了自己的数据类型,因此您必须指定如何序列化您自己的数据类型。这就是函数convert_to_builtin_type的作用。

    1. Python数据模型
    2. 现在我们遇到了如何序列化自定义对象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文档。

      希望这会有所帮助。