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

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

#### Footnotes

... 化された状態値とともに呼び出されます 18
  これらのメソッドはクラスインスタンスのコピーを 実装する際にもｔ用いられます
... は期待通りの動作を行います。19
  このプロトコルはまた、 `copy` で定義されている浅いコピーや深いコピー操作でも用いら れます。