Objekt abspeichern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
MikeJey
User
Beiträge: 5
Registriert: Sonntag 4. März 2018, 13:10

Hallo liebe Python-User,

ich stehe vor dem Problem, dass ich ein Objekt als Datei abspeichern möchte um später in einem Auswerteprogramm dieses Objekt wieder benutzen zu können.

Zum Beispiel definiere ich die Klasse "Verdampfer" die paar Funktionen noch enthält.

Code: Alles auswählen

class Verdampfer(object):
    
    def __init__(self, TimeGrid, v_dict, global_init_dict):
        
        self.TimeGrid     = TimeGrid
                      
        '''Verdampfergeometrie'''
        self.s_H          = v_dict['s_H']
        self.s_B          = v_dict['s_B']
        self.s_T          = v_dict['s_T']
        ...
    def Energiebilanz(self, m_Ads, m_C, T_C):
        ... 
    def record(self):
    	...
                
      
def main():
    
      
    '''Geometrie'''
    s_H          = 0.5                      # m
    s_B          = 1.6                      # m
    s_T          = 0.002                    # m
    ...
       
    v_dict = {'s_H':s_H, 's_B':s_B, 's_T':s_T, ...}    
 
    return v_dict
Im Berechnungsprogramm wird das Objekt Verdampfer1 erstellt mit dem Aufruf:

Code: Alles auswählen

Verdampfer1       = Verdampfer.Verdampfer(TimeGrid, v_dict, global_init_dict)
Und nun möchte ich das Objekt "Verdampfer1" abspeichern. Und im Auswerteprogramm möchte ich das Objekt "Verdampfer1" laden können, in welchem sich alle Daten wiederfinden, z.B. das für Verdampfer1.s_B dann der entsprechende Wert (1,6 m) hinterlegt ist.

Ich hab mich schon durch viele Tutorials und Foren gelesen. Ich kam bisher zu keinem Ergebnis, bzw. ist meine bisherige Lösung, dass ich die dicts (z.B. v_dict) abspeichere und im Auswerteprogramm nochmal ein Objekt Verdampfer1 mit dem v_dict initialsiere. Aber ich möchte einfach das fertige Objekt reinladen.

Beste Grüße
Mike
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@MikeJey: was sollen denn die einbuchstabigen Präfixe? Was ist wohl das wichtige am v_dict, dass es ein Wörterbuch ist, oder dass es die Parameter eines Verdampfers beschreibt? Auch bei längerem Nachdenken kam ich nicht auf die Bedeutung der s_-Präfixe. In der Physik/Mathematik/... benutzt man gerne einbuchstabige Variablen in Formeln, die dann länglich an anderer Stelle erklärt werden. Bei Programmiersprachen ist das nicht üblich, da benutzt man gleich aussagekräftige Namen. Den Sinn von global_init_dict mußt Du mir auch noch erklären, denn global sollte in einer Klasse eigentlich nichts sein. Es ist unüblich die Parameter einer Objekt-Initialisierung als Wörterbuch anzugeben, benutzte explizite Parameter. Strings sind kein Ersatz für Kommentare (# blabla), das sind einfach nur unnötige Stringliterale, die gleich nach ihrer Erzeugung wieder weggeschmissen werden.

Das erste was einem in den Sinn kommt, ist pickle-Serialisierung, weil die schon in Python eingebaut ist. Da Pickle aber nicht mit Änderungen in der Klassenstruktur zurecht kommt, ist es nicht für Langzeitspeicherung (länger als 3ms) gedacht. Da Du scheinbar TimeGrid nicht mitspeichern willst, müßtest Du da sowieso __getstate__/__setstate__-Methoden definieren. Dann ist der Weg nicht mehr weit, einfach eine Serialisierung zu einem Wörterbuch zu machen und das ganze als JSON zu speichern (to_dict/from_dict-Methoden). Das anreichern mit einem TimeGrid müßte dann immer separat erfolgen.
Antworten