Pythonではクラス定義の中に
__init__
という名前の(特殊)メソッドを定義すると、インスタンス作成時に呼ばれます。これがコンストラクタです。
という説明、よく見ます。
が、これはPythonに公式ドキュメントに書かれている『コンストラクタ』の用法とは明らかに異なります。
https://docs.python.org/ja/3.12/library/itertools.html#itertools.chain.from_iterable
classmethod chain.from_iterable(iterable)
chain() のためのもう一つのコンストラクタです。
https://docs.python.org/ja/3.12/library/stdtypes.html#index-13
コンストラクタ int() 、 float() 、 complex() で、特定の型の数を生成できます。
https://docs.python.org/ja/3.12/library/stdtypes.html#list
型コンストラクタを使う:
list()
またはlist(iterable)
https://docs.python.org/ja/3.12/library/datetime.html
他のコンストラクタ、および全てのクラスメソッドを以下に示します:
https://docs.python.org/ja/3/library/tarfile.html#tarfile.TarFile.open
代替コンストラクターです。
https://docs.python.org/ja/3.12/library/zoneinfo.html#zoneinfo.ZoneInfo
ZoneInfo
クラスには2つの別のコンストラクターがあります
classmethod ZoneInfo.from_file(fobj, /, key=None)
(略)
classmethod ZoneInfo.no_cache(key)
どうでしょう。
これらの箇所を読んでなお「クラス定義の中の __init__
という特殊メソッド」をPython公式ドキュメントがコンストラクタと呼んでいるなどと思えるでしょうか。
- インスタンス化のために呼び出されるクラス名や型名に束縛されている呼び出し可能オブジェクトのこと
- インスタンス化の目的で設計された呼び出し可能オブジェクト(特にクラスメソッド)のこと
をコンストラクタと呼んでいると私は思います。
じっさいPythonの公式ドキュメントで __init__
に対してコンストラクタなどと呼んでいる箇所はありません。
それどころか__init__
になにか固有な名称が付けられてはいないです。一貫して__init__メソッド
と書かれているはすです。
(多少筆が滑って、別の書き方になっている箇所はあったりするかもしれません。私は見つけてないです)
「C++やJava言語でいうコンストラクタ」の用法を「プログラミング言語一般のコンストラクタ」だと思っている人が多すぎて、似たような用途の(しかし決して同じ動作ではない)__init__
のことをコンストラクタだと説明してしまっているだけだと思います。
Pythonプログラマではない人、Python公式ドキュメントなんて読んでいない人とコミュニケーションするのに、あえてあわせてコンストラクタと呼ぶのは構わないでしょう。
でもPythonの言語に関する(深い)話をしている時は、__init__メソッド
と呼ぶ方が混乱がないんじゃないでしょうか?
とはいえ「コンストラクタ」が用語集にも文法定義にもでてこないし、言語リファレンスの項目にもないという状況なのでやっかいですね。
ある種の特定の使い方をする呼び出し可能オブジェクトだというだけですから、文法定義にも言語リファレンスにも出てこなくて当たり前ではありますが。