6.7 selfの自己弁護
Pythonでクラスのインスタンスメソッドを定義する際、第1引数として必ず self を指定しなければならないことは、時として批判の対象になることがあります。
しかし、Pythonはこの self 引数を利用して、対象となる適切なオブジェクトの属性やメソッドを見つけ出しています。
メソッド呼び出しの裏側
Section titled “メソッド呼び出しの裏側”オブジェクトのメソッドを呼び出したとき、背後でPythonが実際に行っている処理を見てみましょう。
前章で作成した Car クラスのオブジェクトを例にします。
# Carクラスの定義(復習)class Car(): def exclaim(self): print("I'm a Car!")
# オブジェクトの作成とメソッドの呼び出しcar = Car()car.exclaim()# 出力: I'm a Car!car.exclaim() が実行されたとき、Pythonの内部では以下の処理が自動的に行われています。
carオブジェクトが属しているクラス(Carクラス)を探し出します。- 見つけた
Carクラスのexclaim()メソッドに対し、self引数としてcarオブジェクト自身を渡して実行します。
self の役割を直接確認する
Section titled “self の役割を直接確認する”Pythonが裏で行っている処理を、あえて手動で記述してみることも可能です。 クラス名を使ってメソッドを直接呼び出し、引数としてオブジェクトを渡してみます。
# クラスから直接メソッドを呼び出し、引数にオブジェクト(car)を渡すCar.exclaim(car)# 出力: I'm a Car!このコードを実行すると、通常の car.exclaim() と全く同じ動作になることが確認できます。
このように、self とは「メソッドを実行する対象となっているオブジェクト自身」を受け取るための重要な受け皿なのです。