目次

前のトピックへ

8.11. weakref — 弱参照

次のトピックへ

8.15. types — 組み込み型の名前

このページ

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

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

このモジュールでは UserDict クラスを定義しています。これは辞書オブジェクトのラッパーとして動作します。これは dict (Python 2.2から利用可能な機能です)によって置き換えられています。 dict の導入以前に、 UserDict クラスは辞書風のサブクラスをオーバライドや新メソッドの定義によって作成するために使われていました。

参考

最新バージョンの UserDict Python ソースコード

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

class UserDict.UserDict([initialdata])

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

ノート

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

class UserDict.IterableUserDict([initialdata])

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

マッピングのメソッドと演算(節 マップ型 を参照)に加えて、 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 を利用することが推奨されています。

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

ノート

このモジュールは後方互換性のためだけに残されています。Python 2.2より前のバージョンのPythonで動作する必要のないコードを書いているのならば、組み込み list 型から直接サブクラス化することを検討してください。

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

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

class UserList.UserList([list])

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

ノート

UserList クラスは Python 3.0 では collections モジュールに移動されました。 2to3 ツールが自動的にソースコードの import 文を修正します。

変更可能シーケンスのメソッドと演算(節 シーケンス型 — 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 と等価なものはありません)。

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

これらのクラスは実際のクラスやユニコードオブジェクトに比べてとても効率が悪いということに注意した方がよいでしょう。これは特に MutableString に対して当てはまります。

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

class UserString.UserString([sequence])

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

class UserString.MutableString([sequence])

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

バージョン 2.6 で撤廃: MutableString クラスは Python 3.0 では削除されます。

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

MutableString.data

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