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 によって各オブジェクト(p1 と p2)が正しく自身の値を保持・出力できていることがわかります。
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 を使用した例
慣習に縛られず、別の名前(myobject や abc)を使用したコード例です。
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()