##
3 クラス生成をカスタマイズする

デフォルトでは、新形式クラスは `type()` を使って構築 されます。クラス定義が別の名前空間に読み込まれ、 クラス名は `type(name, bases, dict)` の結果に結合されます。

クラス定義が読み込まれる際、__metaclass__ が定義されていれば、 `type()` の代わりに __metaclass__ が指している 呼び出し可能オブジェクトが呼び出されます。 これによって、

- クラスが生成される前にクラス辞書を変更する
- 他のクラスのインスタンスを返す - 本質的にはファクトリ関数の役割を 果たす

といった、クラス生成のプロセスを監視したり置き換えたりする クラスや関数を書くことができます。

`__metaclass__`
  この変数は `name`、`bases`、および `dict` を引数として 取るような任意の呼び出し可能オブジェクトにできます。 クラス生成の際、組み込みの `type()` の代わりに、指定された 呼び出しオブジェクトが呼び出されます。 バージョン 2.2 で 新たに追加 された仕様です。

以下に優先順で並んだ規則によって、適切なメタクラスが決定されます:

- `dict['__metaclass__']` があればそれを使います。

- それ以外の場合で、最低でも一つ基底クラスを持っているなら、 基底クラスのメタクラス (__class__ 属性を探し、なければ 基底クラスの型) を使います。

- それ以外の場合で、__metaclass__ という名前のグローバル変数 があれば、それをつかいます。

- それ以外の場合には、旧形式のメタクラス (types.ClassType) を使います。

メタクラスは限りない潜在的利用価値を持っています。これまで試されて きたアイデアには、ログ記録、インタフェースのチェック、 自動デリゲーション、自動プロパティ生成、プロキシ、フレームワーク、 そして自動リソースロック／同期といったものがあります。