Python の古いスタイルと新しいスタイルのクラスの違いは何ですか? どちらをいつ使用すればよいですか?
ベストアンサー1
Python 2.1 までは、ユーザーが利用できるのは旧スタイルのクラスのみでした。
(旧スタイルの) クラスの概念は、型の概念とは無関係です。 が
x
旧スタイルのクラスのインスタンスである場合、x.__class__
は のクラスを指定しますx
が、type(x)
は常に です<type 'instance'>
。これは、すべての旧スタイルのインスタンスが、そのクラスとは無関係に、instance と呼ばれる単一の組み込み型で実装されているという事実を反映しています。
新しいスタイルのクラスは、クラスと型の概念を統合するために Python 2.2 で導入されました。新しいスタイルのクラスは、単なるユーザー定義型であり、それ以上でもそれ以下でもありません。
x が新しいスタイルのクラスのインスタンスである場合、 は
type(x)
通常 と同じになりますx.__class__
(ただし、これは保証されません。新しいスタイルのクラスのインスタンスは に返される値をオーバーライドできますx.__class__
)。新しいスタイルのクラスを導入する主な動機は、完全なメタモデルを備えた統一されたオブジェクト モデルを提供することです。
また、ほとんどの組み込み型をサブクラス化する機能や、計算プロパティを有効にする「記述子」の導入など、多くの即時的な利点もあります。
互換性の理由から、クラスはデフォルトでは依然として古いスタイルのままです。
新しいスタイルのクラスは、別の新しいスタイルのクラス (つまり、型) を親クラスとして指定するか、他の親が必要ない場合は「最上位の型」オブジェクトを指定することによって作成されます。
新しいスタイルのクラスの動作は、返される型に加えて、いくつかの重要な詳細において古いスタイルのクラスの動作と異なります。
これらの変更の一部は、特別なメソッドの呼び出し方法など、新しいオブジェクト モデルに不可欠なものです。その他の変更は、多重継承の場合のメソッド解決順序など、互換性の問題によりこれまで実装できなかった「修正」です。
Python 3 には新しいスタイルのクラスのみがあります。
サブクラス化するかどうかに関係なく
object
、クラスは Python 3 では新しいスタイルになります。