概要
Pythonには、旧スタイルクラスと新スタイルクラスの2つのクラスモデルが存在しました。旧スタイルクラスはPython 2以前の標準でしたが、Python 2.2で新スタイルクラスが導入され、クラスと型の区別をなくし、オブジェクトモデルが一貫したものになりました。Python 3では、すべてのクラスが新スタイルクラスとして扱われます。
新スタイルクラスとは?
新スタイルクラスはobjectを継承することで作成されます。これにより、Pythonのクラスはすべてのオブジェクトの基底クラスであるobjectから派生し、統一されたオブジェクトモデルが構築されます。
class NewStyleClass(object):
pass
新スタイルクラスでは、次のような重要な機能が利用可能です。
super()の使用
新スタイルクラスでは、親クラスのメソッドを呼び出すためにsuper()を簡単に使うことができます。- MRO(メソッド解決順序)の改善
複数のクラスから継承する際のメソッド探索順序が、C3線形化アルゴリズムに基づく新しいメソッド解決順序(MRO)に改善されました。 __slots__の導入
メモリ使用量を削減するために、インスタンスが持つ属性を制限する__slots__を利用できます。
旧スタイルクラスとの違い
旧スタイルクラスはobjectを継承せず、クラスと型の概念が分離していました。例えば、旧スタイルクラスのインスタンスに対して type() を呼び出すと、すべて <type 'instance'> という同じ型が返され、クラス自体の型は返されません。
class OldStyleClass():
pass
一方、新スタイルクラスでは、type() を使うと正しいクラス名が返され、型とクラスが統一されています。
旧スタイルクラスの例
class OldStyleClass():
pass
obj = OldStyleClass()
print(type(obj)) # <type 'instance'>
新スタイルクラスの例
class NewStyleClass(object):
pass
obj = NewStyleClass()
print(type(obj)) # <class '__main__.NewStyleClass'>
Python 3ではどうなるのか?
Python 3では、すべてのクラスが新スタイルクラスとして定義され、旧スタイルクラスはサポートされなくなりました。したがって、Python 3では class ClassName: と書くだけでも、暗黙的に object を継承しているため、新スタイルクラスが作成されます。
結論
旧スタイルクラスと新スタイルクラスの主な違いは、クラスと型の統一、MROの改善、super() の使用などにあります。Python 3ではすべてのクラスが新スタイルクラスとして扱われ、旧スタイルクラスは存在しません。Python 2で開発する場合も、新スタイルクラスを使用することが推奨されます。