クラスとインスタンスは好みに合わせて2種類の方法で記述することができます: 旧スタイルもしくはクラシックスタイルと新スタイルです。
Python 2.1以降では、ユーザが好んで指定した場合のみ旧スタイルが使用されます。
(旧スタイルの)クラスの概念と型の概念には関連性があります:
もしxが旧スタイルのクラスのインスタンスだった場合、
x.__class__
というコードはクラスxを指定しますが、
type(x)
は常に<type'instance'>
となります。
これは、すべての旧スタイルのインスタンスが、それらのクラスがどのクラスであるか
にかかわらず、instance
と呼ばれる一つの内蔵型として
実行されるということを反映しています。
新スタイルのクラスは、クラスと型を統一するためにPython 2.2で導入されました。
新スタイルのクラスはユーザ定義型と少しも変わりません。
もし、xが新スタイルクラスのインスタンスであった場合、
type(x)
はx.__class__
と同じになります。
新スタイルクラスを導入する一番の理由は、メタモデルを用いた 統一的なオブジェクトモデルを提供することにあります。 これには、 また、ほとんどの組み込み型のサブクラスが作成できる、 属性を計算するための"デスクリプタ"の導入できる等の利点があります。
互換性のために、デフォルトではクラスは旧スタイルになります。 新スタイルのクラスは、他の新スタイルクラス (すなわち型)を親クラスとして定義する、 もしくは、他の親クラスが必要ない場合に "最上位型" object を継承することで 作成することができます。 新スタイルクラスの動作は旧スタイルクラスの動作とは、 typeが何を返すかといったことをはじめ、何点か重要な部分が異なります。 特殊メソッドの呼び出しなど、これらの変更は新オブジェクトモデルの基盤となっています。 それ以外の部分は、多重継承時のメソッドの解決順などのように、 互換性の問題で以前は実装が不可能であった"修正"が新クラスに含まれています。
このマニュアルは新スタイルのクラスに対しては最新情報を含んでいません。 より詳細な情報を得たい場合は、 http://www.python.org/doc/newstyle.htmlを参照してください。
旧クラスを廃止にして、新クラスのセマンティクスのみを残すことが計画されています。 この変更は、Python 3.0で採用されることになるでしょう。 new-style classic old-style
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。