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 を参照) に加えて、 UserDictIterableUserDict インスタンスは次の属性を提供します:

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 できます。これが役に立つときがあって、例えば UserListstr の両方を同時に継承できます。本物の 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 オブジェクト。