Python(同じモジュール内))でメンバー関数を参照するときにself
を使用することになっていますか?
より一般的には、メソッドだけでなく変数にもself
を使用する必要があるのか疑問に思っていました。
オスカルビは明示的ではないため、答えを追加します。
次の場合にself
を使用します。
あなたはしてはいけないself
を使用する
instance = MyClass()
を実行すると、instance.my_method(some_var)
ではなくinstance.my_method(self, some_var)
として_MyClass.my_method
_を呼び出します。これらは、自己を使用しない場合の単なる例です。 dosは、shouldを使用するときです。
self
を使用して、他のインスタンスメソッドからインスタンス変数とメソッドを参照します。インスタンスメソッドの定義の最初のパラメーターとしてself
も配置します。
例:
class MyClass(object):
my_var = None
def my_method(self, my_var):
self.my_var = my_var
self.my_other_method()
def my_other_method(self):
# do something...
名前self
についてnothing 'special'があります。これは、Pythonistasによって慣例により優先される名前であり、そのパラメーターに含まれるものが示されます。
Pythonランタイムは、意図的にインスタンスを提供するかどうかにかかわらず、インスタンスのインスタンスメソッドを呼び出すと、 'self'値を渡します。これは通常、簡単に診断/理解されたエラーになります(関数は間違った数のパラメーターで呼び出されます)が、_*args
_を使用すると、かなり奇妙な型エラーが発生する可能性があります。
インスタンスのインスタンスメソッドを呼び出すと、パラメーターが暗黙的に渡されます。メソッドを呼び出すインスタンスが含まれています。したがって、関数呼び出しでself
に言及しないのは、(a)上記のように、それは意味をなさない(一般にスコープにself
がなく、 self
はキーワードでも特別な名前でも何でもありません); (b)使用するインスタンスを既に指定しています(_my_instance.
_を記述して)。
もちろん、クラスからアクセスすることにより、インスタンスメソッドを明示的に呼び出すことができます。この場合、インスタンスを最初のパラメーターとして明示的に渡す必要があります。一般的に言って、あなたはこれをしたくありません。そして、あなたは特に最初のパラメータがこのように明示的に渡された何かである可能性を考慮したコードを書きたくない。これは、C++でif (this == null)
をチェックするのと似ています。意味がない場合は、呼び出しコードはwrongで、合法でない場合は道徳的に(少なくともPythonでは、未定義の動作に問題はありませんが、それでも道徳的に間違っています。)
インスタンスメソッド内では、self
はインスタンスを値として割り当てられたパラメーターなので、_self.whatever
_を記述してインスタンスの属性にアクセスできます。他の「暗黙のthis
」スタイル言語とは異なり、属性名はnot暗黙的に「スコープ内」です。
self
には他のユースケースはありません。これもまた特別な名前ではなく、それが命名規則が扱う特定の目的の1つであるためです。別のモジュールから「変数」(実際には属性)にアクセスする必要がある場合は、モジュール名を使用します。現在のモジュールからアクセスしたい場合、接頭辞は必要ありません、またはそのことについて本当に可能です。 (まあ、あなたはcouldglobals()
によって返されたdict
で明示的に検索しますが、それをしないでください。)
インスタンス変数およびメソッドの場合、いつでもselfを使用することが必須です。