###
3.3.2.4 __slots__

デフォルトでは、新旧どちらのクラスも、属性の記憶領域として使うための 辞書を持っています。この仕様は、ほとんどインスタンス変数を持たない ようなオブジェクトの場合には記憶領域の無駄遣いになります。 記憶領域の消費量は、大量のインスタンスを生成する際には深刻です。

このデフォルトの設定は、新たな形式のクラス定義において __slots__ を 定義することでオーバライドできます。__slots_ 宣言はインスタンス 変数の配列を受け取ります。各々のインスタンス上には、各変数の値を 記憶するのにちょうど必要な量だけの記憶領域を確保します。 各々のインスタンスに対して __dict__ が生成されることがないので、 記憶領域が節約されます。

`__slots__`
  このクラス変数には、文字列、反復可能オブジェクト、あるいはインスタンスが 用いる変数名を表す文字列からなる配列を代入することができます。 この変数が新しい形式のクラスで定義されている場合、__slots__ は、各インスタンスに対して宣言された変数に必要な記憶領域を確保し、 __dict__ と__weakref__ が自動的に生成されないようにします。 バージョン2.2 以降で新規追加された 仕様です。

__slots__ を利用する際の注意

- __dict__ 変数がない場合、__slots__ に列挙されていない 新たな変数をインスタンスに代入することはできません。 列挙されていない変数名を使って代入しようとした場合、 `AttributeError` が送出されます。 新たな変数を動的に代入したいのなら、__slots__ を宣言する際に `'__dict__'` を変数名の配列に追加してください。

  バージョン2.3 以降で変更された 仕様: これまでは、`'__dict__'` を __slots__ 宣言に追加しても、インスタンス変数名として他にリストされていない 新たな属性の代入はできませんでした。

- __slots__ を定義しているクラスの各インスタンスに __weakref__ 変数がない場合、インスタンスに対する弱参照 (weak reference) はサポートされません。 弱参照のサポートが必要なら、 __slots__ を宣言する際に `'__weakref__'` を変数名の配列に追加してください。 バージョン2.3 以降で変更された 仕様: これまでは、`'__weakref__'` を __slots__ 宣言に追加しても、弱参照のサポートを有効にできませんでした。
- __slots__ は、クラスのレベルで各変数に対するデスクリプタ (3.3.2 を参照) を使って実装されます。その結果、 __slots__ に定義されているインスタンス変数のデフォルト値は クラス属性を使って設定できなくなっています; そうしないと、 デスクリプタによる代入をクラス属性が上書きしてしまうからです。

- あるクラスで、基底クラスですでに定義されているスロットを 定義した場合、基底クラスのスロットで定義されているインスタンス変数は (デスクリプタを基底クラスから直接取得しない限り) アクセスできなく なります。これにより、プログラムの趣意が不定になってしまいます。 将来は、この問題を避けるために何らかのチェックが追加されるかもしれません。

- __slots__ 宣言が動作するのは、定義が行われたクラスだけに 限られています。その結果、サブクラスでは、__slots__ を定義 しない限り __dict__ を持つことになります。

- __slots__ は、`long`、 `str`、および `tuple` といった、``可変長 (variable-length)'' の組み込み型 から導出されたクラスでは動作しません。

- __slots__ には、文字列でない反復可能オブジェクトを 代入することができます。辞書型も使うことができます; しかし将来、 辞書の各キーに相当する値に何らかの特殊な意味が割り当てられる かもしれません。