メソッドの第1引数
インスタンスはクラス定義を元にメモリ上に作られた処理の実体である。1.1 導入ではビルトインクラスのインスタンスを取り上げたが、ここではユーザ定義クラスを対象として解説を行う。 インスタンスの構造はクラス定義によって定められるため、同じクラスから生成されたインスタンス群は同じ構造をもつ。つまり、全てのインスタンスは同じ名前のメソッドをもつ。そのため、メソッドを利用するにはそれがどのインスタンスに属するものであるかを指定する必要がある。
クラス定義の外側においてインスタンスを指定するには、インスタンスに割り当てた変数を用いればよい。
code:class51.py
class Myclass:
def method(self):
print('# メソッドを実行しました')
m1 = Myclass()
m2 = Myclass()
m3 = Myclass()
m2.method() # (1):クラス定義外からのアクセス
メモリ上に作られたインスタンスとそれらに属するメソッドの様子を示す下図に示す。3つのインスタンスに割り当てられたオブジェクトIDはそれぞれ#10, #30, #40とする。 https://scrapbox.io/files/6523a1287394aa001ccc6d85.png
これに対して、メソッドの内側においては、そのメソッドが属するインスタンスに割り当てられた変数名を知ることができない。
code:class52.py
class Myclass:
def method(self):
print('このインスタンスに割り当てられた変数名は m1, m2, m3 のどれですか?')
m1 = Myclass()
m2 = Myclass()
m3 = Myclass()
m2.method() # m2から呼出し
そこで、メソッドの第1引数には、そのメソッドが属するインスタンスのオブジェクトIDが渡される。メソッドはこの値を用いて自身が属するインスタンスを特定することができる。この値はselfという変数名で受けるのが通例である。 https://scrapbox.io/files/652a1e9eb8cd87001cc55253.png
確認しよう。
code:class53.py
class Myclass:
def method(self):
print(id(self), ':変数selfの値')
print('# 実験1 -------------------')
m1 = Myclass()
print(id(m1), ':変数m1の値')
m1.method() # (1)
print('# 実験2 -------------------')
m2 = Myclass()
print(id(m2), ':変数m2の値')
m2.method() # (1)
本資料を用意した環境では、オブジェクトIDは15桁の整数値として得られた。
code:Result.txt
# 実験1 -------------------
140168947173024 :変数m1の値
140168947173024 :変数selfの値
# 実験2 -------------------
140168947173168 :変数m2の値
140168947173168 :変数selfの値
この結果より、変数m1, m2とメソッドの第1引数selfは、対応するインスタンスに割り当てられていることが確認できた。
2個のメソッドを有するインスタンスの模式図を示す。変数selfが保持する値に注目。
https://scrapbox.io/files/652a46e5b3e758001cd0a4e1.png
/icons/hr.icon
※ ブラウザのバックボタンで戻る