Seite 1 von 1

Kopieren von Klassen

Verfasst: Montag 1. Mai 2017, 18:52
von crishy
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())

Re: Kopieren von Klassen

Verfasst: Montag 1. Mai 2017, 20:55
von 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.

Re: Kopieren von Klassen

Verfasst: Montag 1. Mai 2017, 21:22
von crishy
@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.

Re: Kopieren von Klassen

Verfasst: Montag 1. Mai 2017, 22:13
von 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.

Re: Kopieren von Klassen

Verfasst: Dienstag 2. Mai 2017, 05:57
von crishy
Danke, ich habe mir auserdem überlegt zwei verschiedene Klassen zu verwenden, eine für die Daten und die zweite für die serrialisierung.

Re: Kopieren von Klassen

Verfasst: Dienstag 2. Mai 2017, 07:36
von Sirius3
@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?

Re: Kopieren von Klassen

Verfasst: Dienstag 2. Mai 2017, 10:02
von bwbg
@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.

Re: Kopieren von Klassen

Verfasst: Dienstag 2. Mai 2017, 19:27
von crishy
@Sirius3: danke configparser ist eine super lösung. lg