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