13.1.5.1 通常のクラスインスタンスの pickle 化および unpickle 化

pickle 化されたクラスインスタンスが unpickle 化されたとき、 __init__() メソッドは通常呼び出されません 。 unpickle 化の際に __init__() が呼び出される方が望ましい場合、 旧スタイルクラスではメソッド __getinitargs__() を定義することが できます。このメソッドはクラスコンストラクタ (例えば __init__()) に渡されるべき タプルを 返さなければなりません。 __getinitargs__() メソッドは pickle 時に呼び出されます; この関数が返すタプルはインスタンスの pickle 化データに組み込まれます。

新スタイルクラスでは、プロトコル 2 で呼び出される __getnewargs__() を定義する事ができます。インスタンス生成時に内 部的な不変条件が成立する必要があったり、(タプルや文字列のように)型の __new__()メソッドに指定する引数によってメモリの割り当てを変更す る必要がある場合には__getnewargs__()を定義してください。新スタ イルクラスCのインスタンスは、次のように生成されます。


 obj = C.__new__(C, *args)
 

ここでargsは元のオブジェクトの__getnewargs__()メソッドを 呼び出した時の戻り値となります。__getnewargs__()を定義していな い場合、argsは空のタプルとなります。

クラスは、インスタンスの pickle 化方法にさらに影響を与えることが できます; クラスが __getstate__() メソッドを定義している 場合、このメソッドが呼び出され、返された状態値はインスタンスの内容 として、インスタンスの辞書の代わりに pickle 化されます。 __getstate__() メソッドが定義されていない場合、 インスタンスの __dict__ の内容が pickle 化されます。

unpickle 化では、クラスが __setstate__() も定義していた 場合、unpickle 化された状態値とともに呼び出されます 13.5__setstate__() メソッドが定義 されていない場合、pickle 化された状態は辞書型でなければならず、 その要素は新たなインスタンスの辞書に代入されます。クラスが __getstate__()__setstate__() の両方を定義して いる場合、状態値オブジェクトは辞書である必要はなく、これらのメソッド は期待通りの動作を行います。 13.6

警告: 新しいスタイルのクラスにおいて __getstate__() が負値を返す場合、__setstate__() メソッドは呼ばれません。



脚注

... 化された状態値とともに呼び出されます13.5
これらのメソッドはクラスインスタンスのコピーを 実装する際にもt用いられます
... は期待通りの動作を行います。13.6
このプロトコルはまた、 copy で定義されている浅いコピーや深いコピー操作でも用いら れます。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。