2017-09-26 60 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