2017-09-26 59 views
0

我想了解以下主题并提出一些未解决的问题。谁能帮我?:使用自己的类型 - Python

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

这是python的对象模型。看看这个:https://docs.python.org/3/reference/datamodel.html – HuStmpHrrr

+0

你基本上提取obj属性作为一个字典,这是我的阅读。 –

回答

0

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

  1. JSON序列化和反序列化。

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

  • Python数据模型
  • 现在我们遇到问题如何序列的自定义对象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文档。

    希望这会有所帮助。

    +0

    我真的很感激你的回应。慢慢阅读,理解相同。以下是我想要了解的链接:https://pymotw.com/2/json/ – Ravi

    +0

    是的。您提供的链接也解释了您的问题。请记住,JSON是一种基于文本的数据交换格式,您需要处理您自己的数据类型的编码和解码过程。 – rojeeer