Python 速習チュートリアル

Python の self 引数

1. self 引数

self パラメータ(引数)は、クラスの現在のインスタンスを指し示す参照です。
これを使用することで、クラスに属するプロパティメソッドにアクセスすることが可能になります。

1.1 self を使ったクラスプロパティへのアクセス

以下の例では、self を使用してインスタンスのプロパティにアクセスし、メソッドを定義しています。

class Person:
  def __init__(self, name, age):
    self.name = name
    self.age = age

  def greet(self):
    print("こんにちは、私の名前は " + self.name)

p1 = Person("エミル", 25)
p1.greet()

       注意点:self パラメータは、クラス内のあらゆるメソッドにおいて、必ず最初の引数として定義しなければなりません。

2. なぜ self を使うのか?

もし self がなければ、Pythonは「どのオブジェクトのプロパティにアクセスしたいのか」を判別することができません。self は、メソッドを特定のオブジェクトに紐付ける役割を果たしています。

2.1 インスタンスごとの識別

以下の例では、self によって各オブジェクト(p1p2)が正しく自身の値を保持・出力できていることがわかります。

class Person:
  def __init__(self, name):
    self.name = name

  def printname(self):
    print(self.name)

p1 = Person("トビアス")
p2 = Person("ライナス")

# それぞれ異なるインスタンスのプロパティが出力される
p1.printname()
p2.printname()

3. self という名前でなくても良い

実は、このパラメータの名前は必ずしも self である必要はありません。自分の好きな名前を付けることができますが、メソッドの最初の引数であることというルールは絶対です。

3.1 myobject や abc を使用した例

慣習に縛られず、別の名前(myobjectabc)を使用したコード例です。

class Person:
  def __init__(myobject, name, age):
    myobject.name = name
    myobject.age = age

  def greet(abc):
    print("こんにちは、私の名前は " + abc.name)

p1 = Person("エミル", 36)
p1.greet()

プロの視点: 技術的には名前を変えても動作しますが、Pythonの強力な慣習として self を使うことが強く推奨されます。コードの可読性を高め、他の開発者が混乱しないようにするためです。

4. self を使ったプロパティへのアクセス

self を通じて、クラス内で定義されたあらゆるプロパティにアクセスできます。

4.1 複数のプロパティにアクセスする例

Car クラスを作成し、複数の情報を表示する例を見てみましょう。

class Car:
  def __init__(self, brand, model, year):
    self.brand = brand
    self.model = model
    self.year = year

  def display_info(self):
    print(f"{self.year}年式 {self.brand} {self.model}")

car1 = Car("トヨタ", "カローラ", 2020)
car1.display_info()

5. self を使ったメソッドの呼び出し

プロパティだけでなく、クラス内の他のメソッドを self を使って呼び出すことも可能です。

5.1 メソッド内から別のメソッドを呼び出す例

以下の例では、welcome メソッドの中で self.greet() を呼び出しています。

class Person:
  def __init__(self, name):
    self.name = name

  def greet(self):
    return "こんにちは、" + self.name

  def welcome(self):
    # self を使って他のメソッドを呼び出す
    message = self.greet()
    print(message + "! 私たちのウェブサイトへようこそ。")

p1 = Person("トビアス")
p1.welcome()