pythonには「self」という変数が出てくる。
こいつの必要性と使い方がいまいちわからなかったので簡単に調べてみた。
#selfって何者?
インスタンスそのもの。
※以下のようなプログラムがあったとき、「instance」がインスタンス変数。
class classSample():
def __init__(self, strA):
self.fieldA = strA
instance = classSample("Hello World")
print(instance.fieldA)
>ec2-user:~/environment $ python Sample.py
Hello World
つまり上記の例の場合、「self」=「instance」となる。
#なぜ必要なの?
pythonでは以下のようにスコープの異なる変数が出てくる。
・グローバル変数
・クラス変数
・インスタンス変数
・ローカル変数
それぞれを使い分けたいときに、「self」が役立つっぽい。
※それぞれの変数のスコープについておさらい
グローバル変数:モジュール内(ファイル内?)で使用する変数
クラス変数:クラス内で使用する変数
インスタンス変数:インスタンス内で使用する変数
ローカル変数:メソッド内で使用する変数
例えばすべての変数名を同じ「strA」として扱った場合、呼び出し方によって参照する対象が異なる。
(以下参照)
strA = "グローバル変数"
class cls():
# クラス変数に値を代入
strA = "クラス変数"
def __init__(self):
# インスタンス変数に値を代入
self.strA = "インスタンス変数"
# ローカル変数に値を代入
strA = "ローカル変数"
# 変数出力
print("コンストラクタから: " + self.__class__.strA)
print("コンストラクタから: " + self.strA)
print("コンストラクタから: " + strA)
# メソッドからも参照できる。
def method1(self):
# コンストラクタのローカル変数は参照できない。
# ここではグローバル変数を宣言する。
global strA
print("メソッドから: " + self.__class__.strA)
print("メソッドから: " + self.strA)
print("メソッドから: " + strA)
# インスタンス化
# と同時にコンストラクタ内の処理が実行される。
instance = cls()
# メソッド実行
instance.method1()
>ec2-user:~/environment $ python Sample.py
コンストラクタから: クラス変数
コンストラクタから: インスタンス変数
コンストラクタから: ローカル変数
メソッドから: クラス変数
メソッドから: インスタンス変数
メソッドから: グローバル変数
※ローカル変数はコンストラクタからも宣言できる。
同名の変数が同一ファイル内に存在していても、
参照の仕方が違えば違うスコープの変数として新規に宣言したことになるので注意。
各変数の参照の仕方についてまとめる
・グローバル変数
global strA
・クラス変数
self.__class__.strA
・インスタンス変数
self.strA
・ローカル変数
strA
selfがついてたらクラス変数またはインスタンス変数。
selfがついてなかったらグローバル変数またはローカル変数
と一目でわかる。(あまり使うことなさそうだけど:D)
#結論
「self」が真価を発揮するのは、スコープの違う変数を使い分けるとき。
※そのうち他の使い方も発見したら追記します...