Documentation Python

概要

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で開発する場合も、新スタイルクラスを使用することが推奨されます。

円