__getstate__ et __setstate__

Résolu/Fermé
riripas Messages postés 17 Date d'inscription lundi 27 juin 2016 Statut Membre Dernière intervention 25 août 2016 - 25 juil. 2016 à 23:53
soyouz123 Messages postés 1 Date d'inscription jeudi 3 janvier 2019 Statut Membre Dernière intervention 3 janvier 2019 - 3 janv. 2019 à 12:34
Source : https://openclassrooms.com/fr/courses/235344-apprenez-a-programmer-en-python/233046-appliquez-des-methodes-speciales : 5e partie : Des méthodes spéciales utiles à pickle.

Bonsoir à tous. :) Voici mon problème : dans l'exemple de ce cours, nous devons obtenir 0. En copiant et en collant le code du cours, et en l'ayant vérifié (normalement), j'arrive à cette capture d'écran : la variable reste à 0. Je ne comprends pas. C'est pour cela que j'écris, avant que je ne m'énerve contre Python. :)

Merci beaucoup pour votre aide.

PS : dans la suite du cours, on propose une autre solution avec __setstate__ mais celle-ci ne marche pas non plus. Mais j'attends de voir la solution avec __getstate__.

Bonne fin de soirée à tous. ;)

2 réponses

Salut,

Dans ton dernier bloc, ce n'est pas
Temp().attribut_temporaire
que tu dois afficher, mais
score.attribut_temporaire
, puisque c'est dans ta variable score que tu affectes la désérialisation ;)
1
riripas Messages postés 17 Date d'inscription lundi 27 juin 2016 Statut Membre Dernière intervention 25 août 2016 2
26 juil. 2016 à 20:27
Merci beaucoup, cela marche ! J'essaie immédiatement avec __setstate__. :)
0
riripas Messages postés 17 Date d'inscription lundi 27 juin 2016 Statut Membre Dernière intervention 25 août 2016 2
26 juil. 2016 à 20:34
Voilà, cela marche avec __setstate__. Merci pour toutes les secondes que j'ai économisées grâce à toi. ;) Bonne soirée.
0
soyouz123 Messages postés 1 Date d'inscription jeudi 3 janvier 2019 Statut Membre Dernière intervention 3 janvier 2019
3 janv. 2019 à 12:34
Merci beaucoup, cela m'a énormément aidé
0
riripas Messages postés 17 Date d'inscription lundi 27 juin 2016 Statut Membre Dernière intervention 25 août 2016 2
25 juil. 2016 à 23:57
Bon, ma capture d'écran n'est pas passée.

Ca ne marche pas visiblement. Allez, je copie/colle.


Python 3.5.2rc1 (v3.5.2rc1:68feec6488b2+, Jun 12 2016, 08:56:24) [MSC v.1900 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import pickle
>>> class Temp:
"""Classe contenant plusieurs attributs, dont un temporaire"""

def __init__(self):
"""Constructeur de notre objet"""
self.attribut_1 = "une valeur"
self.attribut_2 = "une autre valeur"
self.attribut_temporaire = 5

def __getstate__(self):
"""Renvoie le dictionnaire d'attributs à sérialiser"""
dict_attr = dict(self.__dict__)
dict_attr["attribut_temporaire"] = 0
return dict_attr

>>> with open("attributs", "wb") as fichier:
pickler = pickle.Pickler(fichier)
pickler.dump(Temp())
print(Temp().attribut_temporaire)


5
>>> with open("attributs", "rb") as fichier:
depickler = pickle.Unpickler(fichier)
score = depickler.load()
print(score)


<__main__.Temp object at 0x0000018D2CFEDA90>
>>> with open("attributs", "rb") as fichier:
depickler = pickle.Unpickler(fichier)
score = depickler.load()
print(Temp().attribut_temporaire)


5
>>>



Re-bonne soirée. ;)
0