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