2010年6月26日土曜日

新スタイルクラス

原文:http://python-history.blogspot.com/2010/06/new-style-classes.html
原文投稿者:Guido van Rossum

以前、Pythonへのクラスの追加は、本質的には後付であったという説明を行った。実装の選択は、Pythonの「手抜きをする」という哲学に従って行われた。しかし、Pythonが進歩するに従い、エキスパートのPythonユーザは、クラスの実装の問題について頻繁に不満を述べるようになってきた。

クラスの実装の1つの問題は、組み込み型のサブクラス化を行う方法がなかったということである。例えば、リスト、辞書、文字列やその他のオブジェクトは何か「特別」なもので、サブクラス化して、一部を特殊化することができなかった。この制限は、「オブジェクト指向である」と主張していた言語にしては、奇妙に見えてしまっていた。

他の問題は、型システムが全般的に、ユーザ定義クラスに関しては「間違っている」ようにしか見えなかったことである。例えば、まったく別の関係ないクラスのユーザ定義の2つのオブジェクトのabがあったとすると、type(a) == type(b)を評価すると、真になってしまうのである。言うまでもなく、C++やJavaなどの、クラスが言語の型システムと密接に結びついているような他の言語に明るい開発者から見ると、かなりおかしく見えた。

Python2.2では、しっかりと時間をとって「正しく動作する」ようにクラスの再実装を行った。この変更は、Pythonのサブシステムをもっとも大々的に書き直したものとなったため、人々からは、この努力に対して「セカンドシステム症候群である」という非難を受ける可能性もあった。この変更では、組み込み型の継承ができないという問題を手っ取り早く修正するだけではなく、真のメタクラスのサポートの追加、多重継承時のメソッド解決順序という難しい問題の修正、その他の多くの機能の追加を行った。この仕事においては、"Putting Metaclasses to Work"という、Ira FormanとScott Danforthが書いた本の影響を強く受けている。この本は、Smalltalkとも違う、メタクラスが何かという示唆を私に提供してくれた。

クラスの書き直しに関しての面白い点は、旧スタイルクラスと置き換えて導入したのではなく、新しい言語機能として新スタイルクラスを導入したということである。後方互換性のために、Python 2のクラス作成プロトコルのデフォルトとして、旧スタイルクラスの実装はそのまま残された。新スタイルクラスを作成するためには、objectクラス(新スタイルクラス階層のルート)などの、既存の新スタイルクラスをただ継承するだけで行うことができる。

class A(object):
  実装
  ...

新スタイルクラスへの変更は大成功であった。新しく導入されたメタクラスは、フレームワーク作成者の中で人気の機能となったし、例外事項が減り、クラスを説明するのが簡単になった。実際、後方互換性は残されているため、新スタイルクラスの導入が行われても、古いコードは同じように動作させ続けることができた。最終的に、旧スタイルは言語から削除されることになると思うが、Pythonユーザは"class MyClass(object)"という、それほど悪くない書き方に、慣れてきている。