🦄

selfについて解説

2023/09/16に公開

今回はpythonのクラスで使用するselfについて解説します。

selfとは

selfとは

  • インスタンス自体を指す特殊な変数

です。

インスタンスとは?

インスタンスはクラスから生成されたオブジェクトのことを指します
これはコードで見た方が理解しやすいと思います。

class Car:
    # クラス内の関数をメソッドと呼ぶ
    # コンストラクタ(初期化メソッド)
    def __init__(self, color, size):
        self.color = color  # インスタンス変数colorを設定
        self.size = size  # インスタンス変数modelを設定

    # インスタンスメソッド
    def display_info(self):
        print(f"これは{self.color}色の{self.size}mの車です。")

# インスタンスを作成
my_car = Car("青", "3") # これがインスタンス
his_car = Car("赤","2") # これがインスタンス

# インスタンスメソッドを呼び出す
my_car.display_info()
his_car.display_info()
これは青色の3mの車です。
これは赤色の2mの車です。

上のコードでは、my_carオブジェクトとhis_carオブジェクトがインスタンスになります。

改めてselfとは

  • selfは、メソッドを呼んだインスタンス自体を指します。例えば、my_car.display_info()を呼び出すと、selfはmy_carオブジェクトになります

また__init__メソッドは、クラスの新しいインスタンスが生成されるときに自動的に呼ばれます。従ってmy_car = Car("青", "3")を呼び出した場合もselfはmy_carオブジェクトになります。

使い方

使い方は、コードを見て理解している人も多いと思います。
クラス内の変数である、self.colorなどをインスタンス毎に分けて保持することができます。

selfは関数を呼び出したインスタンスによって値を変えます。それによって変数がmy_car.colorやhis_car.colorのように値を変えるため、同じコードで別々の変数を保存しておくことが可能になるのです。

深い話

selfの使い方についてはここまでで理解できたと思うので、もう少し深い話をします。
selfはインスタンス自体を指す特殊な変数であると説明しました。
これはどこで定義されているのでしょうか?

正解はコードで見た通り、メソッドの引数として定義されます。具体的には、次の条件になります。

  • 条件:メソッドの1番目の引数が「インスタンス自体を指す変数」になる

実は、このルールを守っていれば名前はなんでも問題ありません。例えば次のようなコードも考えられます。

class Car:
    # コンストラクタ(初期化メソッド)
    def __init__(something, color, size):
        something.color = color  # インスタンス変数colorを設定
        something.size = size  # インスタンス変数modelを設定

    # インスタンスメソッド
    def display_info(banana):
        print(f"これは{banana.color}色の{banana.size}mの車です。")

# インスタンスを作成
my_car = Car("青", "3")
his_car = Car("赤","2")

# インスタンスメソッドを呼び出す
my_car.display_info()
his_car.display_info()

このコードも同じように動作します。出力は次のようになります。

これは青色の3mの車です。
これは赤色の2mの車です。

上記の条件によって「インスタンス自体を指す変数」は決定されており、分かりやすさと慣例のため、全てselfに統一されているのです。
メソッド内部で名称が統一されていれば、どんな名前でも問題ないのです。

まとめ

今回はselfについて解説しました。
selfとは

  • インスタンス自体を指す特殊な変数

で、メソッドの一番最初の引数で定義されているのでした。
※間違えやすいですが、selfはインスタンス変数ではありません。インスタンス自体を指す特殊な変数です。self.colorのように、インスタンスが持つ固有の変数を「インスタンス変数」と呼びます。

それでは今回はここまでです。最後まで読んでいただきありがとうございました!

Discussion