【Python】Pythonのself、クセが強いんじゃ

Programming

Pythonにおけるselfの仕様が非常にめんどくさいものだったので、愚痴がてら記事を書いてみます

まずselfって何?

そのクラスから生成されたインスタンス自身を指すものです。javaとかならthis,swiftだとまんまselfに近い感じですかね。
ちなみにこれ、予約語ではないそうで、やろうと思えばselfのことをhogeとでもpiyoとでも呼んでしまえるようです。しかし慣例に基づき、一般的にはselfを使っているそうな。
昔のPythonエンジニアが意地悪でなくてよかったですね。

selfのウザいところ

「メソッドを定義する時は引数として書かなきゃいけないのに代入は書く必要がない」
という謎仕様です。
よく分からないかと思いますが、まず下のコードを見て下さい。


class Sample:
    def get_self(self):
        return self

a = Sample()
b = a.get_self()
print(a is b)  

ここでSampleクラス内では、get_selfの引数としてselfが定義されています。
ちなみにあるクラスのメソッドにおける第一引数はself(生成されるインスタンス自身)が予約されています。他のオブジェクトを第一引数に入れたくても無駄です。selfは割り込みおじさんの如く勝手に入ってきます。ですので、基本的に第一引数にはselfと書くことになります。

厄介なのは、次のコードです。

b = a.get_self()

なんと!さっき引数にselfと定義したはずなのに引数を入れる場所が空っぽです。

これじゃSyntaxErrorだ、動かないよ。。。

とはならず、、、普通に動きますTrueを出力します。

そう、

生成されたインスタンス自身(self)を呼ぶ引数は定義しないといけないのに、
実際にメソッドを呼び出すときには自動で代入されるから()内に書く必要がない

という分かりにくい仕様になっているんです。
これは激おこですね。書くんだったら書く、書かないんだったら書かないではっきりさせてほしい…

で、メソッドを呼び出す時は自動で代入されるということで、呼び出す際の引数はいきなり定義時における第二引数から書いちゃってOKです。
つまり


class Hoge:
    def sum(self, a, b):
        return a + b

h = Hoge()
print(h.sum(1,2))

のように書いて大丈夫です。

分かりにくくめんどくさいですけどとにかく慣れですね…

コメント

タイトルとURLをコピーしました