3.14.5.1 Serializzazione e deserializzazione di normali istanze di classe

Quando una istanza di classe serializzata viene deserializzata, normalmente il suo metodo __init__() non viene invocato. Se si vuole che il metodo __init__() venga richiamato nella deserializzazione, una classe di vecchio stile può definire un metodo __getinitargs__(), che dovrebbe restituire una tupla contenente gli argomenti da passare al costruttore di classi (per es. __init__()). Il metodo __getinitargs__() viene richiamato all'atto della serializzazione; la tupla che esso restituisce viene incorporata nel pickle per l'istanza.

I tipi di nuovo stile possono fornire il metodo __getnewargs__() che viene usato per il protocollo 2. È necessario implementare tale metodo se il tipo stabilisce alcune invarianti interne quando viene creata l'istanza, o se l'allocazione di memoria è influenzata dal valore passato al metodo __new__() per il tipo (nelle stringhe e nelle tuple avviene la stessa cosa). Istanze di nuovo stile di tipo C vengono create usando


 obj = C.__new__(C, *args)
 

dove args è il risultato che si ottiene chiamando __getnewargs__() sull'oggetto originale; se non esiste __getnewargs__(), viene assunta una tupla vuota.

Le classi possono anche influire sul modo in cui le proprie istanze vengono serializzate; se la classe definisce il metodo __getstate__(), questo viene invocato ed il risultato viene serializzato come il contenuto dell'istanza invece che come contenuto del dizionario dell'istanza. Se non esiste il metodo __getstate__(), viene serializzata l'istanza __dict__.

Riguardo alla deserializzazione, se la classe definisce anche il metodo __setstate__(), viene invocata con lo stato deserializzato.3.6 Se non esiste un metodo __setstate__(), lo stato serializzato deve essere un dizionario ed i suoi componenti vengono assegnati al nuovo dizionario di istanze. Se una classe definisce sia __getstate__() che __setstate__(), lo stato dell'oggetto non necessariamente deve essere un dizionario, e questi metodi possono fare ciò che vogliono.3.7

Per classi di nuovo stile, se __getstate__() restituisce un valore falso, non verrà invocato il metodo __setstate__().



Footnotes

... deserializzato.3.6
Questi metodi possono venire usati anche per implementare la copia delle istanze della classe.
... vogliono.3.7
Questo protocollo viene anche usato per le operazioni di copia sia superficiale che profonda, come definite nel modulo copy.
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.