1)self
メソッドシグネチャの明示的なパラメーターとして必要なのはなぜですか?
メソッドは関数でfoo.bar(baz)
あり、単なる構文糖衣であるためbar(foo, baz)
です。クラスは、値の一部が関数である単なる辞書です。(コンストラクターも単なる関数であるため、Pythonは必要ありません。new
)Pythonは、オブジェクトがより単純なコンポーネントから構築されていることを明示していると言えます。これは「明示的は暗黙的よりも優れている」という哲学に基づいています。
対照的に、Javaのオブジェクトは本当に魔法であり、言語のより単純なコンポーネントに減らすことはできません。Java(少なくともJava 8まで)では、関数は常にオブジェクトが所有するメソッドであり、この所有権は言語の静的な性質のために変更できません。したがって、何をthis
参照するかについてあいまいさはないため、暗黙的に定義することは理にかなっています。
JavaScriptは、this
Javaのような暗黙の言語の例ですが、Pythonのように関数はオブジェクトとは別に存在できます。これは、異なるコンテキストで関数が渡され、呼び出されるときに参照するものについて多くの混乱をもたらしthis
ます。多くthis
の場合、関数の固有のプロパティを参照する必要がありますが、実際には関数の呼び出し方法によって純粋に決定されます。私が持つと信じてthis
Pythonでのような明示的なパラメータは、これははるかに少ない混乱になるだろうと。
明示的self
パラメーターのその他の利点:
デコレータは、他の機能をラップする単なる機能です。メソッドは単なる関数であるため、デコレーターはメソッドでも同じように機能します。暗黙的な自己がある場合、デコレーターはメソッドに対して透過的に機能しません。
クラスメソッドと静的メソッドはインスタンスパラメータを取りません。クラスメソッドは、最初の引数としてクラスを取ります(通常、と呼ばれますcls
)。明示的なself
or cls
パラメーターは、何が起こっているのか、メソッドで何にアクセスできるのかをより明確にします。
2)インスタンス変数を常に修飾する必要があるのはなぜself.
ですか?
Javaでは、メンバー変数の前に「this.
」を付ける必要はありませんが、Pythonではself.
常に「」が必要です。その理由は、Pythonには変数を宣言するための明示的な構文がないためx = 7
、新しいローカル変数を宣言するかメンバー変数に割り当てるかを判断する方法がないためです。指定self.
すると、このあいまいさが解決されます。