Kopieren von Klassen

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
crishy
User
Beiträge: 4
Registriert: Montag 1. Mai 2017, 17:15

Hallo ich moechte mit pickle eine Klasse serrialisieren, scheitere jedoch bei der uebergabe der Werte.

Weiss jemand bescheid?

Code: Alles auswählen

#!/usr/Local/bin/python
import pickle
from copy import deepcopy

class Parameter:
    def __init__(self):
        self.__file=""
        self.__temp_Wohnzimmer=0


    def setTemp_Wohnzimmer(self,temp_Wohnzimmer):
        self.__temp_Wohnzimmer=temp_Wohnzimmer

    def getTemp_Wohnzimmer(self):
        return self.__temp_Wohnzimmer

    def setFile(self,file):
        self.__file=file

    def getFile(self):
        return self.__file  
    
    def save(self):
        pickle.dump(self, open(self.__file, 'wb'))
        print("par",self.__temp_Wohnzimmer)

    def load(self):
        self=deepcopy(pickle.load(open(self.__file, 'rb')))
        print("par",self.__temp_Wohnzimmer)

    def temp_Wohnzimmer(self):
        return self.__temp_Wohnzimmer

t=Parameter()
t.setFile("hoi")
t.setTemp_Wohnzimmer(21)
#t.save()
t.setTemp_Wohnzimmer(0)
t.load()
print(t.getTemp_Wohnzimmer())
Zuletzt geändert von Anonymous am Montag 1. Mai 2017, 20:43, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@crishy: Die Klasse ist ziemlich merkwürdig. Lass mal die ganzen Attribute mit den doppelten, führenden Unterstrichen weg. Implementierungsdetails kennzeichnet man mit *einem* führenden Unterstrich. Triviale Getter und Setter schreibt man in Python nicht, da greift man direkt auf das Attribut zu, also in den Fällen hat man dann gar keinen führenden Unterstrich. Attributnamen, also auch Methodennamen, werden per Konvention klein_mit_unterstrichen geschrieben. Siehe Style Guide for Python Code. Das sieht insgesamt so aus als würdest Du in einer anderen Programmiersprache als Python programmieren wollen.

Das was Du `file` nennst in Attributen und Methodennamen ist gar keine Datei, sondern ein Datei*name*.

Dateien die man öffnet, sollte man auch wieder schliessen. Die ``with``-Anweisung ist in dem Zusammenhang sehr nützlich.

Was soll der Sinn sein gleich nach dem Deserialisieren eine tiefe Kopie von dem Objekt zu machen, welches gerade neu erstellt wurde‽

Die Zuweisung an den *lokalen* Namen `self` macht keinen Sinn. Du kannst ein Objekt nicht sich selbst ersetzen lassen, das bleibt immer das selbe Objekt und das deserialisierte Objekt ist ein völlig anderes, wenn auch potentiell wertgleiches Objekt.

Warum gibt es zwei Methoden die unterschiedlich heissen, aber genau das gleiche machen?

Wie man das Problem mit dem Speichern und Laden löst, hängt davon ab was Du *eigentlich* damit machen möchtest. Ich würde nämlich als erstes mal den Sinn dieser Klasse in Frage stellen wollen.
crishy
User
Beiträge: 4
Registriert: Montag 1. Mai 2017, 17:15

@BlackJack: danke für deine Hilfe. Ich werde deine Vorschläge umsetzen. Die Aufgabe dieser Klasse wäre es Einstellungen/Parameter im Programm in eine Datei abzuspeichern und wieder abzurufen.
BlackJack

@crishy: Da würde ich nicht unbedingt Pickle für benutzen. Das eignet sich nicht wirklich gut für Daten die länger gespeichert werden und deren Struktur Veränderungen während der Entwicklung unterliegen können.
crishy
User
Beiträge: 4
Registriert: Montag 1. Mai 2017, 17:15

Danke, ich habe mir auserdem überlegt zwei verschiedene Klassen zu verwenden, eine für die Daten und die zweite für die serrialisierung.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@crishy: für Konfigurationsdateien nimmt man entweder gleich das fertige Modul configparser, das auf .ini-Dateien aufbaut, oder sucht sich aus den vorhandenen textbasierten Dateiformaten ein passendes aus (json, yaml, ...). Dann stellt sich noch die Frage, was an Mehrwert eine Konfigurations-Klasse gegenüber z.B. einem Wörterbuch bieten soll?
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

@crishy: BlackJack hatte zurecht den Sinn einer Klasse überhaupt infrage gestellt. Deine "Lösung" waren gleich zwei Klassen - also doppelter Unsinn ;)

Die Frage "Warum eine Klasse?" ist bislang unbeantwortet. Die Frage bleibt: Was willst Du erreichen? Die Antwort sollte ohne das Wort "Klasse" auskommen und wirklich nur das beschreiben, was geschehen soll ohne auf Details einer möglichen Implementierung einzugehen.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
crishy
User
Beiträge: 4
Registriert: Montag 1. Mai 2017, 17:15

@Sirius3: danke configparser ist eine super lösung. lg
Antworten