3.3.3 クラス生成をカスタマイズする
デフォルトでは、新形式クラスは type() を使って構築
されます。クラス定義が別の名前空間に読み込まれ、
クラス名は type(name, bases, dict) の結果に結合されます。
クラス定義が読み込まれる際、__metaclass__ が定義されていれば、
type() の代わりに __metaclass__ が指している
呼び出し可能オブジェクトが呼び出されます。
これによって、
- クラスが生成される前にクラス辞書を変更する
- 他のクラスのインスタンスを返す - 本質的にはファクトリ関数の役割を
果たす
といった、クラス生成のプロセスを監視したり置き換えたりする
クラスや関数を書くことができます。
- __metaclass__
-
この変数は
name、bases、および dict を引数として
取るような任意の呼び出し可能オブジェクトにできます。
クラス生成の際、組み込みの type() の代わりに、指定された
呼び出しオブジェクトが呼び出されます。
バージョン 2.2 で 新たに追加 された仕様です。
以下に優先順で並んだ規則によって、適切なメタクラスが決定されます:
dict['__metaclass__'] があればそれを使います。
- それ以外の場合で、最低でも一つ基底クラスを持っているなら、
基底クラスのメタクラス (__class__ 属性を探し、なければ
基底クラスの型) を使います。
- それ以外の場合で、__metaclass__ という名前のグローバル変数
があれば、それをつかいます。
- それ以外の場合には、旧形式のメタクラス (types.ClassType)
を使います。
メタクラスは限りない潜在的利用価値を持っています。これまで試されて
きたアイデアには、ログ記録、インタフェースのチェック、
自動デリゲーション、自動プロパティ生成、プロキシ、フレームワーク、
そして自動リソースロック/同期といったものがあります。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。
|