コンストラクタの名前

林です。

オブジェクト思考プログラミング言語の起源は1962年にリリースされたSimulaや1972年にリリースされたSmalltalkであるが、本格的に実用化されたものは1979年にリリースされたC++であることはオープン系プログラマの共通の認識だ。

プログラミングパラダイムにオブジェクト思考を取り入れている言語には、クラスからインスタンスを生成したときに必ず一度実行されるコンストラクタという機能がある。

このコンストラクタをどのような名前にするかということは、プログラミング言語毎の言語仕様によるのだが、多くの言語では「クラス名と同じ名前」か「Newという名前」を採用することがある種の伝統となっている。

以下に年齢という状態を持つ生命というオブジェクトの雛型となるLifeクラスを作成しながら、主要な言語毎にコンストラクタの名前を確認してみる。

C++の場合は、コンストラクタの名前にクラス名を採用しており、下記におけるlife.hppの14行目がコンストラクタの宣言で、life.cppの9~10行目がコンストラクタの定義である。

Javaの場合も、コンストラクタの名前にクラス名を採用しており、下記におけるLife.javaの10~12行目がコンストラクタの定義である。


Perlの場合は、コンストラクタの名前にnewというキーワードを採用しており、下記におけるlife.pmの7~14行目がコンストラクタの定義である。


Visual Basicの場合も、コンストラクタの名前にNewというキーワードを採用しており、下記におけるLife.vbの10~12行目がコンストラクタの定義である。


このように、広く普及しているオブジェクト指向に対応したプログラミング言語では、コンストラクタの名前にクラス名かNewというキーワードが採用されている。

これが、昨今大人気のPythonだと事情が違ってくる。

Pythonの場合は、コンストラクタの名前に__init__というキーワードを採用しており、下記におけるlife.pyの7~8行目がコンストラクタの定義である。


これには意表を突かれた。

「なんですか?これ?」って感じである。

コンストラクタの名前は、「クラス名と同じ」か「New」という伝統を受け入れてきた者にとっては非常に違和感を覚える名前だ。

たぶん、「初期化する」を意味する「initialize」という単語を略したものだと思うのだが、前後に付いている二つのアンダースコアは何のために必要なのだろうか?

プログラマがinitializeというキーワードをコード中に書きたいときに名前が衝突しないようにするための配慮なのだろうか?

そもそも、「constructor」とは「構築子」のことであり、オブジェクトのテンプレートとなるクラスにメモリを割り当てることにより新たなインスタンスを生成する責務を受け持つ機能だ。

そのような意味合いにおいて、従来の「initialize」、つまり、「初期化」とは性格を別にする。

故に、伝統的なオブジェクト指向プログラミング言語に慣れ親しんできたプログラマにとっては、「コンストラクタの名前は__init__です」と言われてもなかなか受け入れにくい。

筆者は__init__のアンダースコアを一つ付け忘れたことにより、下記のエラーに30分ほど苦しめられることになった。