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が使われるとのこと。