クラスのもつ変数には、クラス変数とインスタンス変数の2種類の変数が存在します。今回はこれらの変数の宣言方法や違いについて説明します。
インスタンス変数とは
インスタンス変数とは、それぞれのインスタンスごとに独立した変数です。たとえば、クラスはいくつもインスタンスを生成することができますが、それぞれのインスタンス変数は別のものとして扱われ変数に値を代入しても、インスタンスごとに別々の値が保存されています。
インスタンス変数の宣言とアクセス方法
インスタンス変数を作成する場合は、クラス内のメソッドで以下のように記述します。一般的にインスタンス変数を生成するときは コンストラクタ __init__() 内で行います。
1 |
self.インスタンス変数 = 値 |
また、インスタンス変数にアクセスするときは以下のように記述します。
1 |
self.インスタンス変数 |
インスタンス変数の使用例
以下は、インスタンス変数を作成し、その変数を表示する例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class MyClass: def __init__(self, text): # 初期化: インスタンス作成時に自動的に呼ばれる self.value = text # インスタンス変数 value を宣言する def print_value(self): # インスタンス変数 value の値を表示する関数 print(self.value) # インスタンス変数 value にアクセスし表示する if __name__ == "__main__": a = MyClass("123") # インスタンス a を作成 b = MyClass("abc") # インスタンス b を作成 print(a.value) # 123 print(b.value) # abc a.print_value() # 123 b.print_value() # abc |
上の例では、クラス MyClass 内の変数 value は、インスタンス変数として定義されています。インスタンス a, b の2つのインスタンスが作成されていますが、それぞれのインスタンス変数 value は別の値を保持してることが確認できます。
また、Python ではクラス内で定義されたメソッドからインスタンス変数にアクセスする場合は、メソッド(インスタンスメソッド)の引数に self を渡して利用します(self ではなく他の文字列でも動作しますが、Python では慣習的に self を渡します)。引数の self には自動的にインスタンス自身が渡されます。上の例の print_value メソッドはインスタンス変数 value にアクセスし、その値を表示しています。
クラス変数とは
クラス変数は、インスタンス変数とは違い、すべてのインスタンス間で共通した値をもつ変数です。クラス変数はインスタンスを生成することなく参照することができます。
クラス変数の宣言とアクセス方法
クラス変数を宣言するときはインスタンス変数と違い self は付けずにクラス内に宣言します。
1 2 |
class MyClass: クラス変数 = 値 |
また、クラス変数にアクセスするときは以下のように記述します。
1 |
クラス.クラス変数 |
クラス変数の使用例
以下は、クラス変数を作成し、その変数の値を表示する例です。
1 2 3 4 5 |
class MyClass: value = "abc" # クラス変数を宣言 if __name__ == "__main__": print MyClass.value # abc |
上の例では、クラスのインスタンスを生成することなく MyClass のクラス変数 value にアクセスして表示しています。
以下は、クラスのインスタンスを生成し、クラス変数を表示する例です。
1 2 3 4 5 6 7 8 9 10 11 12 |
class MyClass: value = 0 # クラス変数を宣言 def __init__(self): # 初期化: インスタンス生成時に自動的に呼ばれる MyClass.value += 1 # クラス変数 value にアクセスしインクリメントする if __name__ == "__main__": a = MyClass() # インスタンス a を生成する print MyClass.value # 1 b = MyClass() # インスタンス b を生成する print MyClass.value # 2 |
上のプログラムでは、インスタンスを生成するたびにクラス変数 value を +1 しています。
クラス変数の使用上の注意
クラス変数にアクセスする場合は、特別な理由がない限り「インスタンス.クラス変数」や「self.クラス変数」のようにアクセスすることは避けるべきです。Python ではインスタンス変数をインスタンスオブジェクトから生成することができ、意図せずクラス変数をインスタンス変数で隠蔽してしまうことがあります。
まとめ
今回はインスタンス変数とクラス変数について説明しました。これらの変数の違いをきちんと理解した上で、クラスを活用していきましょう。