次の例を考えてみましょう。
class MyClass:
def func(self, name):
self.name = name
self
が の特定のインスタンスを参照していることはわかっていますMyClass
。しかし、なぜをパラメータとしてfunc
明示的に含める必要があるのでしょうか。メソッドのコードで を使用する必要があるのはなぜでしょうか。他の言語では、これを暗黙的に行うか、代わりに特別な構文を使用します。self
self
言語に依存しない設計上の決定については、以下を参照してください。this/self ポインタを必須かつ明示的に指定することの利点は何ですか?。
OPがメソッドのパラメータを省略して を取得したデバッグの質問を閉じるには、self
TypeError
TypeError: method() は 1 つの位置引数を取りますが、2 つ指定されています代わりに、OPがself.
メソッド本体で省略して を取得した場合NameError
、クラス内で関数を呼び出すにはどうすればいいですか?。
ベストアンサー1
を使用する必要がある理由self.
は、Python ではインスタンス属性を参照するのに特別な構文を使用しないからです。Python では、メソッドが属するインスタンスが自動的に渡されるが、自動的には受け取られないようにメソッドを実行することにしました。メソッドの最初のパラメーターは、メソッドが呼び出されるインスタンスです。これにより、メソッドは関数と完全に同じになり、実際の名前は自由に使用できます (ただし、これはself
慣例であり、他の名前を使用すると、一般的に人々は眉をひそめます)。はself
コードに特別なものではなく、単なる別のオブジェクトです。
Python は、通常の名前と属性を区別するために、Ruby のような特別な構文や、C++ や Java のような宣言の要求、あるいはもっと別の方法など、他の方法も考えられましたが、そうしませんでした。Python は、物事を明示的にして、何が何であるかを明白にすることを重視しており、どこでも完全にそうしているわけではありませんが、インスタンス属性に対してはそうしています。そのため、インスタンス属性への割り当てでは、どのインスタンスに割り当てるかを知る必要があり、 が必要なのですself.
。