インスタンス内でのメソッドの呼出し
あるクラスの内部で定義されているメソッド1、2を考える。メソッド1からメソッド2を呼びだそうとして、次のように記述したとする。
code:call_method1.py
class Myclass:
def method1(self):
method2() # 同じクラスだから見えているだろう♡
def method2(self):
print('我はメソッド2')
m1 = Myclass()
m1.method1()
実行するとNameErrorを吐いて停止する。これはmethod1からmethod2のメソッド名が見えていないことを意味する。なぜだろう?
名前解決のルール上、ある識別子がmethod1のローカルスコープ内に見つからなかった場合に、他のローカルスコープを探しに行くことはない。優先順位に従いグローバルスコープ、ビルトインスコープの順に照合が行われる。つまり、 code:call_method2.py
def method2():
print('我はメソッド2という名前の関数である')
class Myclass:
def method1(self):
method2() # どこを探しに行く?
def method2(self):
print('我はメソッド2')
m1 = Myclass()
m1.method1()
新しく関数method2を追加した。するとmethod1における呼出しの結果、グローバルスコープに作られた関数method2が呼び出される。
https://scrapbox.io/files/652a5da4455492001c38a018.png
メソッドはインスタンスに属するので、それがどのインスタンスに属するものであるのかを指定すれば呼び出すことができる。したがって、次のように記述することにより意図した動作を得ることができる。
code:call_method3.py
def method2():
print('我はメソッド2という名前の関数である')
class Myclass:
def method1(self):
self.method2() # 下図における(2)の呼出し
def method2(self):
print('我はメソッド2')
# インスタンスを2つ生成
m1 = Myclass()
m2 = Myclass()
m2.method1() # 下図における(1)の呼出し
https://scrapbox.io/files/652b867d67d836001bb92bd0.png
/icons/hr.icon
※ ブラウザのバックボタンで戻る