# 8.12. `UserDict` --- 辞書オブジェクトのためのクラスラッパー

ソースコード: Lib/UserDict.py

このモジュールは最小限のマッピングインターフェイスをすでに持っているクラスのために、すべての辞書メソッドを定義しているmixin、 `DictMixin` を定義しています。これによって、 (shelveモジュールのような) 辞書の代わりをする必要があるクラスを書くことが非常に簡単になります。

このモジュールでは `UserDict` クラスも定義しています。 これは辞書オブジェクトのラッパーとして動作します。 これの必要性については既に `dict` を直接的にサブクラス化出来るようになった (Python 2.2 から利用可能な機能です) ことによって大幅に取って代わられています。 `dict` の導入以前には、 `UserDict` クラスはメソッドをオーバライドしたり新しいメソッドを追加して、辞書風のサブクラスを作成するために使われていました。

`UserDict` モジュールは `UserDict` クラスと `DictMixin` を定義しています:

class `UserDict.``UserDict`([initialdata])

  辞書をシミュレートするクラスです。 インスタンスの内容は通常の辞書に保存され、 `UserDict` インスタンスの `data` 属性を通してアクセスできます。 initialdata が与えられた場合は、 `data` はその内容で初期化されます; 他の目的のために使えるように、 initialdata への参照が保存されないことがあるということに注意してください。

  注釈

  後方互換性のために、 `UserDict` のインスタンスはイテレート可能ではありません。

class `UserDict.``IterableUserDict`([initialdata])

  `UserDict` のイテレーションをサポートするサブクラス (使用例: `for key in myDict`).

マッピングのメソッドと演算 (マッピング型 --- dict を参照) に加えて、 `UserDict` 、 `IterableUserDict` インスタンスは次の属性を提供します:

`IterableUserDict.``data`

  `UserDict` クラスの内容を保存するために使われる実際の辞書です。

class `UserDict.``DictMixin`

  `__getitem__()` 、 `__setitem__()` 、 `__delitem__()` および `keys()` といった最小の辞書インタフェースを既に持っているクラスのために、全ての辞書メソッドを定義する mixin です。

  この mixin はスーパークラスとして使われるべきです。上のそれぞれのメソッドを追加することで、より多くの機能がだんだん追加されます。例えば、 `__delitem__()` 以外の全てのメソッドを定義すると、使えないのは `pop()` と `popitem()` だけになります。

  4 つの基底メソッドに加えて、 `__contains__()` 、 `__iter__()` および `iteritems()` を定義すれば、順次能力を増やしていけます。

  mixin はサブクラスのコンストラクタについて何も知らないので、 `__init__()` や `copy()` は定義していません。

  Python 2.6 からは、 `DictMixin` の代わりに、 `collections.MutableMapping` を利用することが推奨されています。

  DictMixin は `viewkeys()`, `viewvalues()`, `viewitems()` メソッドを実装していないことに注意してください。

# 8.13. `UserList` --- リストオブジェクトのためのクラスラッパー

注釈

Python 2.2 がリリースされた際、 `list` から直接的にサブクラス化することがこのクラスの多くのユースケースを包含することとなりました。ですがわずかばかりのユースケースが健在です。

このモジュールは下層のデータストアを包むリストインターフェイスを提供します。デフォルトではデータストアは `list` ですが、(例えば永続化記憶のような) 他のオブジェクトに対してリストのようなインターフェイスで包むのに使うことが出来ます。

加えて、このクラスは多重継承を使って、組み込みクラスに mixin できます。 これが役に立つときがあって、例えば `UserList` と `str` の両方を同時に継承できます。 本物の `list` と本物の `str` ではこれはできないでしょう。

このモジュールはリストオブジェクトのラッパーとして働くクラスを定義します。独自のリストに似たクラスのために役に立つ基底クラスで、これを継承し既存のメソッドをオーバーライドしたり、あるいは、新しいものを追加したりすることができます。このような方法で、リストに新しい振る舞いを追加できます。

`UserList` モジュールは `UserList` クラスを定義しています:

class `UserList.``UserList`([list])

  リストをシミュレートするクラスです。 インスタンスの内容は通常のリストに保存され、 `UserList` インスタンスの `data` 属性を通してアクセスできます。 インスタンスの内容は最初に list のコピーに設定されますが、デフォルトでは空リスト `[]` です。 list は何らかのイテラブル、例えば通常の Python リストや `UserList` オブジェクトです。

  注釈

  `UserList` モジュールは、Python 3 では `collections` に移動しました。 2to3 ツールは、ソースコードの import を自動的に Python 3 向けに修正します。

可変シーケンスのメソッドと演算 (シーケンス型 --- str, unicode, list, tuple, bytearray, buffer, xrange を参照) に加えて、 `UserList` インスタンスは次の属性を提供します:

`UserList.``data`

  `UserList` クラスの内容を保存するために使われる実際の Python リストオブジェクト。

サブクラス化の要件: `UserList` のサブクラスは引数なしか、あるいは一つの引数のどちらかとともに呼び出せるコンストラクタを提供することが期待されています。 新しいシーケンスを返すリスト演算は現在の実装クラスのインスタンスを作成しようとします。 そのために、データ元として使われるシーケンスオブジェクトである一つのパラメータとともにコンストラクタを呼び出せると想定しています。

派生クラスがこの要求に従いたくないならば、このクラスがサポートしているすべての特殊メソッドはオーバーライドされる必要があります。その場合に提供される必要のあるメソッドについての情報は、ソースを参考にしてください。

バージョン 2.0 で変更: Python バージョン 1.5.2 と 1.6 では、コンストラクタが引数なしで呼び出し可能であることと変更可能な `data` 属性を提供するということも要求されていました。Pythonの初期のバージョンでは、派生クラスのインスタンスを作成しようとはしません。

# 8.14. `UserString` --- 文字列オブジェクトのためのクラスラッパー

注釈

このモジュールの `UserString` クラスは後方互換性のためだけに残されています。 書いているコードが Python 2.2 より前のバージョンの Python で動作する必要が無いのならば、 `UserString` を使う代わりに組み込み `str` 型から直接サブクラス化することを検討してください (組み込みの `MutableString` と等価なものはありません)。

このモジュールは文字列オブジェクトのラッパーとして働くクラスを定義します。独自の文字列に似たクラスのために役に立つ基底クラスで、これを継承し既存のメソッドをオーバーライドしたり、あるいは、新しいものを追加したりすることができます。このような方法で、文字列に新しい振る舞いを追加できます。

これらのクラスは本物の文字列や Unicode オブジェクトに比べてとてつもなく非効率であるということに注意すべきです。これは特に `MutableString` に対して当てはまります。

`UserString` モジュールは次のクラスを定義しています:

class `UserString.``UserString`([sequence])

  文字列または Unicode 文字列オブジェクトをシミュレートするクラスです。 インスタンスの内容は通常の文字列または Unicode 文字列オブジェクトに保存され、 `UserString` インスタンスの `data` 属性を通してアクセスできます。 インスタンスの内容は最初に sequence のコピーに設定されます。 sequence は通常の Python 文字列または Unicode 文字列、 `UserString` (またはサブクラス) のインスタンス、あるいは組み込み `str()` 関数を使って文字列に変換できる任意のシーケンスのいずれかです。

  注釈

  `UserString` クラスは、Python 3 では `collections` に移動しました。 2to3 ツールは、ソースコードの import を自動的に Python 3 向けに修正します。

class `UserString.``MutableString`([sequence])

  このクラスは上の `UserString` から派生し、 可変に なるように文字列を再定義します。 可変な文字列は辞書のキーとして使うことができません。 なぜなら、辞書はキーとして 不変な オブジェクトを要求するからです。 このクラスの主な目的は、辞書のキーとして可変なオブジェクトを使うという試みを捕捉するために、継承と `__hash__()` メソッドを取り除く (オーバーライドする) 必要があることを示す教育的な例を提供することです。 そうしなければ、非常にエラーになりやすく、その原因を突き止めることが困難でしょう。

  バージョン 2.6 で非推奨: `MutableString` クラスは Python 3 で削除されました。

文字列および Unicode オブジェクトのメソッドと演算 (文字列メソッド を参照) に加えて、 `UserString` インスタンスは次の属性を提供します:

`MutableString.``data`

  `UserString` クラスの内容を保存するために使われる実際の Python 文字列または Unicode オブジェクト。