Pythonのselfについて
入門Python3 6.7
Pythonではクラスのメソッドにてselfを受け取る必要がある
class Foo(): # 第一引数にselfを受け取る必要がある def hello(self): print("foo hello") foo = Foo() foo.hello()
$ py main.py foo hello
もしselfを指定しない場合これはエラーとなる
class Foo(): # 第一引数にselfを指定しない def hello(): print("foo hello") foo = Foo() foo.hello()
$ py main.py Traceback (most recent call last): File "main.py", line 9, in <module> foo.hello() TypeError: hello() takes 0 positional arguments but 1 was given
つまりhelloの第一引数にfooが渡されるということである。
これはPythonの仕様ということであり、結局のところ内部的には以下の処理とまったく同じ(というかシンタックスシュガー)となる
class Foo(): def hello(self): print("foo hello") foo = Foo() Foo.hello(foo) # クラス名を指定してhelloを呼び出しfooを渡す
$ py main.py foo hello
さらに言えばselfが自身のクラスと関連している必要もなくて同じインターフェイスを持つオブジェクトなら何でもOKということになる
class Bar(): def print_str(self): print(self.str) class Foo(): pass bar = Bar() bar.str = "bar!" foo = Foo() foo.str = "foo!" Bar.print_str(bar) # Barクラスのprint_strにFooオブジェクトを渡しても動く Bar.print_str(foo)
$ py main.py bar! foo!
まぁこれは実際には行儀の良い書き方ではなさそうなのであまり使わないのかもしれませんが。
ちなみにselfという変数名は別に他の名称でも動くがPythonの慣習上selfが使われるとのこと。