それがまさにその通りです。Python のオブジェクトは、実際には単なるプロパティ (属性) の袋です。これらの一部は通常の値ですが、その他は関数です。インスタンスの属性であること以外に、クラスへの特別なバインディングはありません。メソッド呼び出しの構文は、最初のパラメーターを渡す面倒を見てくれる、ちょっとした砂糖です。実際、メソッドは単純な関数であり、最初のパラメーターを明示的に渡すことで、そのように呼び出すことができます。
この選択がなされた正確な理由はわかりませんが、無料の関数を属性として既存のオブジェクトに割り当て、それらをメソッドとして呼び出すことができるという事実に関係していると思います。明示的なself
パラメーターがなければ、さらに混乱を招きます。
メカニズムは Javascript に似ていますが、Javascript では、暗黙的に渡されたthis
引数が、明示的なパラメーターなしで常に という名前のローカル変数として導入されるのthis
に対し、Python では、明示的な最初のパラメーターを使用して、好みの名前を選択できます。self
はキーワードではなく、単なる慣習です。この違いは、関数をより簡単にメソッドとして使用できることも意味します。使用する JavaScript 関数this
は、オブジェクト コンテキストの外で (または、通常はデフォルト オブジェクトのコンテキストでwindow
) 使用すると壊れますが、Python では、最初のパラメーターとして適切なオブジェクト。
他の OOP フレーバー (Java、C++ など) もself
/this
パラメーターをメソッドに渡しますが、これは暗黙的に行わthis
れ、明示的な引数として表示されないことに注意してください。ただし、これらの言語では、メソッドをフリー関数として呼び出すことはできません (vv.、フリー関数をメソッドとして使用することはできません)。
と呼ばれる理由について__init__
は、少なくとも 1 つの利点があります。つまり、コンストラクターの名前を変更しなくても、クラスの名前を変更できるということです。これにより、リファクタリングが容易になり、エラーが発生しにくくなります。ところで、これは Python だけではありません。PHP は を使用しています__construct
が、クラス名のコンストラクターもサポートされていますが、推奨されていません。