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».