cPickle und Objekte von eigenen 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.
Nergal
User
Beiträge: 72
Registriert: Montag 6. Oktober 2008, 14:02

cPickle und Objekte von eigenen Klassen

Beitragvon Nergal » Freitag 9. Januar 2009, 08:28

Hallo,

daß man Objekte von eigenen Klassen pickeln kann weiß ich und das klappt bei einer kleinen Testklasse auch wunderbar. Die Werte und Methoden sind nach dem entpickeln alle noch vorhanden und machen das was sie sollen.

Code: Alles auswählen

class Beispiel:
    def __init__(self):
        self._eins = 1
        self._zwei = 2

    def GetEins(self):
        return self._eins

    def GetZwei(self):
        return self._zwei

    def SetEins(self, Zahl):
        self._eins = Zahl
        return

    def SetZwei(self, Zahl):
        self._zwei = Zahl
        return


Die spätere Klasse wird allerdings um einiges umfangreicher. Die Get- und Set-Methoden gibt es momentan nur zu Testzwecken; wollte nur schauen, ob das Objekt die Methoden behält.

Worum es mir eigendlich geht:
Gibt es gewisse Einschränkungen bzw. häufig auftretende Fehler beim pickeln von Objekten von eigenen Klassen?

Laut der Definition auf python.org sollte das alles so funktionieren, wie ich es brauche:
User-defined classes and their instances: marshal does not support these at all, but pickle can save and restore class instances transparently. The class definition must be importable and live in the same module as when the object was stored.


Wie muss ich den letzten Satz verstehen?
Habe zu Testzwecken die Beispielklasse in einem Modul abgespeichert und in einem Anderen geladen und es funktionierte trotzdem wunderbar.
BlackJack

Beitragvon BlackJack » Freitag 9. Januar 2009, 12:11

Die ge"pickle"te Klasse muss beim entpickeln in dem Modul stecken, in dem sie war, als das "pickle" erstellt wurde. Die Klassen selbst werden nämlich nicht gepspeichert, sondern nur der Name der Klasse eines Objektes und seine Daten. Um dann beim Ent"pickle"n wieder ein Objekt zu erstellen muss deshalb auf die Klasse unter genau dem Namen zugegriffen werden können.

Und Probleme gibt's natürlich auch, wenn die Klassen in inkompatibler Weise verändert werden und die gespeicherten Daten nicht mehr so recht zum Code passen.

Man sollte sich also schon relativ sicher sein, dass sich an Klassen nicht mehr Grundlegendes ändert, wenn man "pickle" für längerfristig gespeicherte Daten verwendet. In dem Fall würde ich eher zu etwas mehr Arbeit raten und die Serialisierung zum Beispiel mit JSON machen.
Nergal
User
Beiträge: 72
Registriert: Montag 6. Oktober 2008, 14:02

Beitragvon Nergal » Freitag 9. Januar 2009, 12:50

Ah, danke :)

Danke für den letzten Tip, aber es handelt sich nur um eine kurzfristige Speicherung und an den Klassen wird auch nichts geändert.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder