Seite 1 von 1

Problem beim "entpicklen" meines Objektes

Verfasst: Dienstag 21. November 2006, 21:27
von LazyChicken
Hallo !

Mein erster Post und ich komme natürlich auch gleich mit einem Python Problem daher ;).

Folgendes: Ich habe um Vererbung zu üben eine Klasse Mitarbeiter und zwei Subklassen Chef und Arbeiter geschrieben.
Nun wollte ich mit Hilfe von pickle meine Instanz der Klassen Chef in einer Datei speichern und wieder laden.
Mit einem print Befehl habe ich dann c (auf dieser Variablen liegt das gepicklete Objetkt) und was ist meine Ausgabe? Folgende:

<__main__.Chef instance at 0x00CF7620>

er zeigt also den Speicherbereich an o_O, finde ich ziemlich komisch, aber ihr wisst da sicher besser bescheid, wenn ihr noch code braucht einfach posten ;) Ciao

Re: Problem beim "entpicklen" meines Objektes

Verfasst: Dienstag 21. November 2006, 21:37
von Joghurt
LazyChicken hat geschrieben:wenn ihr noch code braucht einfach posten ;) Ciao
Ja, bitte...

Was erwartest du denn für eine Ausgabe?

Code: Alles auswählen

>>> class Foo(object):
...  pass
>>> a = Foo()
>>> print a
<__main__.Foo object at 0xa6b1cfec>
>>> a.blubb = 42
>>> import cPickle
>>> pickled = cPickle.pickle(a)
>>> del a
>>> a
NameError: 'a' is not defined
>>> a = cPickle.loads(pickled)
>>> print a.blubb
42

Verfasst: Dienstag 21. November 2006, 23:37
von birkenfeld
Was gibt denn "print c" aus, bevor du es pickelst und wieder einliest?

Re: Problem beim "entpicklen" meines Objektes

Verfasst: Dienstag 21. November 2006, 23:40
von lunar
LazyChicken hat geschrieben: er zeigt also den Speicherbereich an o_O, finde ich ziemlich komisch, aber ihr wisst da sicher besser bescheid, wenn ihr noch code braucht einfach posten
Nö, das ist nicht komisch. Das ist normal. print gibt bei Objekten immer die Speicheradresse und den voll qualifizierten Namen aus, wenn du dieses Verhalten für deine Klasse nicht änderst.

Die Methode, die dahinter steckt, ist __str__(self). Du kannst diese Methode in deiner Klasse überschreiben, um z.B. den Namen des Chefs zurückzugeben:

Code: Alles auswählen

class Chef:
    ...
    def __str__(self):
        return self.name
    ...
Dann gibt der print Befehl den Namen des Chefs aus, wenn du ihn für ein Chef Object aufrufst.

Gruß
lunar

Verfasst: Mittwoch 22. November 2006, 16:25
von LazyChicken
Alles klar danke lunar ;) damit ist meine Frage beantwortet ;)