Skip to content

6.7 selfの自己弁護

Pythonでクラスのインスタンスメソッドを定義する際、第1引数として必ず self を指定しなければならないことは、時として批判の対象になることがあります。 しかし、Pythonはこの self 引数を利用して、対象となる適切なオブジェクトの属性やメソッドを見つけ出しています。

オブジェクトのメソッドを呼び出したとき、背後でPythonが実際に行っている処理を見てみましょう。 前章で作成した Car クラスのオブジェクトを例にします。

# Carクラスの定義(復習)
class Car():
def exclaim(self):
print("I'm a Car!")
# オブジェクトの作成とメソッドの呼び出し
car = Car()
car.exclaim()
# 出力: I'm a Car!

car.exclaim() が実行されたとき、Pythonの内部では以下の処理が自動的に行われています。

  1. car オブジェクトが属しているクラス(Car クラス)を探し出します。
  2. 見つけた Car クラスの exclaim() メソッドに対し、self 引数として car オブジェクト自身を渡して実行します。

Pythonが裏で行っている処理を、あえて手動で記述してみることも可能です。 クラス名を使ってメソッドを直接呼び出し、引数としてオブジェクトを渡してみます。

# クラスから直接メソッドを呼び出し、引数にオブジェクト(car)を渡す
Car.exclaim(car)
# 出力: I'm a Car!

このコードを実行すると、通常の car.exclaim() と全く同じ動作になることが確認できます。 このように、self とは「メソッドを実行する対象となっているオブジェクト自身」を受け取るための重要な受け皿なのです。