2017-09-26 2 views
0

Ich versuche das folgende Thema zu verstehen und habe einige offene Fragen. Kann jemand mir helfen ?:Arbeiten mit Ihren eigenen Typen - 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) 

Frage: Was ist der Zweck des folgenden Codes?

+0

Dies ist das Objektmodell von Python. Sehen Sie sich dieses an: https://docs.python.org/3/reference/datamodel.html – HuStmpHrrr

+0

Sie extrahieren im Grunde Obj Eigenschaften als ein dict, das ist meine Lesung. –

Antwort

0

Ich denke, es gibt zwei Dinge, die Sie wissen müssen, um dieses Code-Snippet zu verstehen.

  1. JSON-Serialisierung und Deserialisierung.

JSON ist ein Datenaustauschformat. Insbesondere ist es textbasiert, dh wenn Sie Ihre Daten in einer Textdatei speichern wollen, müssen Sie festlegen, wie Sie Ihre Daten als Text darstellen (Serialisierungsprozess). Wenn Sie Daten aus einer Textdatei laden, müssen Sie natürlich auch bestimmen, wie der Text in die Speicherstruktur eingefügt wird (Der Deserialisierungsprozess). Zum Glück, das json Modul von Python würde standardmäßig die meisten integrierten Datentypen behandeln, zB Skalartyp, Liste, Diktat usw. Aber für Ihren Fall haben Sie einen eigenen Datentyp erstellt, den Sie angeben müssen wie man seinen eigenen Datentyp serialisiert. Das macht die Funktion convert_to_builtin_type.

  1. Python-Datenmodell

Nun kommen wir auf das Problem, wie das selbstdefinierte Myobj Objekt serialisiert werden. Es gibt keine einheitliche Antwort für diese Frage, aber die Grundlinie ist, dass Sie Ihr Objekt (Deserialisierung) durch den serialisierten Text wiederherstellen können. In Ihrem Fall:

d = { '__class__':obj.__class__.__name__, 
     '__module__':obj.__module__, 
     } 
d.update(obj.__dict__) 

Die obj.__dict__ ist ein integriertes Wörterbuch, die Attribute von obj speichert. Sie können die Python-Dokumentation Data Model lesen, um es zu verstehen. Die Absicht hier ist versuchen, genug Informationen zu geben, um obj wiederherzustellen. Zum Beispiel:

  • __class__=<c> liefert den Namen der Klasse
  • __module__=<m> das Modul bietet die Klasse zu finden.
  • s=<v> bietet das Attribut und den Wert der Myobj.s

Mit diesen drei, können Sie das Objekt, das Sie zuvor gespeichert erholen. Für diese versteckten (integrierten) Attribute, die mit __ beginnen, müssen Sie das Python-Dokument überprüfen.

Ich hoffe, das wäre hilfreich.

+0

Ich schätze Ihre Antwort sehr. Lesen Sie es langsam, um das Gleiche zu verstehen. Unten ist der Link, den ich oben verstehen wollte: https://pymotw.com/2/json/ – Ravi

+0

Ja. Der von Ihnen angegebene Link erklärt auch Ihr Problem.Beachten Sie, dass JSON ein textbasiertes Datenaustauschformat ist. Sie müssen den Codierungs- und Decodierungsprozess Ihres eigenen Datentyps verarbeiten. – rojeeer

Verwandte Themen