【独学Python入門㉛】self

selfはちょっと難しいのですが今回はイメージだけでもつかんでもらえればと思います。

クラスに属する関数(すなわちメソッド)を定義するとき第1引数にselfを渡すというルールがあります。言葉だけ見ると意味が分かりませんね。

BMIを計算するソースコードを作成しました。結果は同じですが、関数とメソッドで記述の違いを比較するとselfの役割が見えてきます。

こちらは関数です。

#関数を定義
def bmi(wt, ht):
    return wt / (ht ** 2)

taro_ht = 1.7
taro_wt = 60.0

#関数を実行して結果を表示
print(bmi(taro_wt, taro_ht))  #※1

input()    #実行後にウィンドウを保持

#右が切れたら左にスワイプしてください

こちらはメソッドです。

#Humanクラスを定義
class Human:
    ht = 0.0    
    wt = 0.0

#クラスの中にメソッドを定義
    def bmi(self):
        return(self.wt) / (self.ht ** 2)

#インスタンス化    
taro = Human()
taro.ht = 1.7
taro.wt = 60.0

#メソッドを実行して結果を表示
print(taro.bmi())    # ※2

input()    #実行後にウィンドウを保持

#右が切れたら左にスワイプしてください

実行結果はどちらもこのようになります。

上記ソースコードの※1と※2を見比べてみてください。

#関数を実行して結果を表示
print(bmi(taro_wt, taro_ht)) #※1

#メソッドを実行して結果を表示
print(taro.bmi())    # ※2

#右が切れたら左にスワイプしてください

関数は引数としてtaro_wtとtaro_htの2つの引数を渡していますね。それに対してメソッドは引数がありませんがちゃんと計算できています。これはなぜでしょうか?関数とメソッドの定義を見比べてみましょう。

#関数を定義
def bmi(wt, ht):
    return wt / (ht ** 2)

#クラスの中にメソッドを定義
def bmi(self):
    return (self.wt) / (self.ht ** 2)

#右が切れたら左にスワイプしてください

関数はwtとhtという2つの引数を要求していますが、メソッドはtaro.wtやtaro.htというプロパティを含んでいるtaroというオブジェクト(インスタンス)をまるごとメソッドに引き渡しています。自分自身をまるごとメソッドに引き渡しているためselfが使用されます。

もう1つテストをしてみます。BMIの値によって表示を変えたいと思います。

#Humanクラスを定義
class Human:
    ht = 0.0    
    wt = 0.0

#クラスの中にメソッドを定義
    def bmi(self, level):    #※4
        if level > ((self.wt) / (self.ht ** 2)):
            print ('問題なし')
        else:
            print('肥満')

#インスタンス化    
taro = Human()
taro.ht = 1.7
taro.wt = 60.0

ft_level = 25.0   #25以上は肥満の基準

#メソッドを実行して結果を表示
taro.bmi(ft_level)    # ※3

input()      #実行後にウィンドウを保持

#右が切れたら左にスワイプしてください

※3で記述している引数はft_levelが1つですがこの回の最初にご説明した通り、第1引数としてtaro(self)が引き渡されるので※4で定義しているメソッドの定義からも分かるようにft_levelは2番目の引数になります。

selfはちょっと難しい考え方ですがPythonを使いこなすうえでは必要になるため少しずつ理解してもらえればと思います。

独学Python入門一覧に戻る