pickle est une bibliothèque standard pour sérialiser des objets Python en octets pour le stockage dans des fichiers et autres. Les objets sélectionnables sont sélectionnables et la régénération d'un objet à partir d'une chaîne d'octets sérialisée s'appelle Unpickle.
Pickle tente de sérialiser les attributs des objets enregistrés dans __dict__
par défaut, mais vous pouvez personnaliser son comportement en définissant une méthode spéciale pour pickle. En particulier, il est utilisé lorsque l'objet à décaper a un objet qui ne peut pas être décapé en tant que membre, ou lorsque l'objet est créé par un constructeur qui prend un argument.
Méthode | Utilisation conforme |
---|---|
__getnewargs__() |
Spécifiez l'argument à transmettre au constructeur lors de la désélection. |
__getstate__() |
__dict__ Au lieu de cela, choisissez l'objet retourné par cette méthode. |
__setstate__(state) |
Reçoit l'objet mariné en tant qu'état et effectue le traitement au moment du décapage. |
Le code suivant est un exemple de script pour voir le comportement de ces méthodes.
python
import pickle
class Foo:
def __new__(self, a):
print('in __new__:', a)
self = object.__new__(self)
# self.a = a
return self
def __init__(self, a):
print('in __init__:', a)
self.a = a
def __getstate__(self):
print('in __getstate__:', self.a)
state = self.__dict__.copy()
return state
def __getnewargs__(self):
print('in __getnewargs__:', self.a)
return (2 * self.a,)
def __setstate__(self, state):
self.__dict__.update(state)
print('in __setstate__:', self.a)
foo = Foo(3)
bar = pickle.dumps(foo)
baz = pickle.loads(bar)
print(baz.__dict__)
Le résultat de l'exécution de ce script est le suivant.
python
in __new__: 3
in __init__: 3
in __getnewargs__: 3
in __getstate__: 3
in __new__: 6
in __setstate__: 3
{'a': 3}
Comme indiqué dans le manuel de cornichon, vous pouvez voir ce qui suit.
--__getnewargs__
est appelé lors du décapage. En d'autres termes, les informations de l'argument passé à __new__
lorsqu'il est décoché sont picklées.
__getnewargs__
est transmise à __new__
.
--Unpicle n'appelle pas «init».