self

pythonは、いっそ、「すべてがオブジェクトなのだ」と思ってしまいたい。

インスタンスも、もちろん、オブジェクトだ。

で、インスタンスがつくられるとき、インスタンスのなかに、じぶん自身がつくられる、というのが、とても分かりにくかったりする。

なにも、これは、ぼくだけでなく、ネットをチェックしてみると、同意見のひとが少なくないんだね。

まずは任意のクラスをつくり、インスタンス化のあと、わざと、エラーを出してみよう。

# クラスをつくる
class Food:
    def curry():
        print("インドカレー")

# インスタンスをつくる
food= Food()

#インスタンスからメソッドを呼び出す
food.curry()

#つぎのようなエラーメッセージがでる
----> 1 food.curry()
TypeError: curry() takes 0 positional arguments but 1 was given

 

food.curry( )は引数をとらない。けれど引数が与えられている。

引数が与えられている? なんだろう?

じつは…インスタンスが作られるとき、第一引数に自分自身が引数として与えられている、というんだなぁ…このへんは、ほーんとに、わかりずらい。

ま、良くわからないまま、クラス側のメソッドに引数を明示的に入れる、というんですねぇ。で、pythonでは、このさい、selfという文字をつかうことが慣習となっている。

オッケー。さきほどのコードを書きなおしてみようか。

# クラスをつくる
class Food:
    def curry(self):
        print("インドカレー")

# インスタンスをつくる
food= Food()

#インスタンスからメソッドを呼び出す
food.curry()

インドカレー

 

こんどはエラーにならない。