インスタンス変数について

4.1 インスタンス変数について

これまでクラス内では変数、メソッド、コンストラクタという概念を学習してきました。その中でコンストラクタの中で宣言された変数を、インスタンス変数と呼び、宣言時には「self.変数名」という形式を用いるのが一般的だと説明しました。

書式:インスタンス変数の宣言

4.1.1 インスタンス変数の特徴①:アクセス方法

続いてインスタンス変数にアクセスする方法について確認していきましょう。

1. クラスの外からのアクセスする場合

まずクラスの外からインスタンス変数の値にアクセス(呼び出す)ためには、インスタンス(オブジェクト)を生成しなければならず、直接、アクセスすることはできません。
生成したインスタンス(インスタンスが格納された変数)を介して、初めてインスタンス変数にアクセスできるということです。

書式:クラス変数へのアクセス(クラス外)

クラス外からインスタンス変数へアクセスする方法は「インスタンス名(インスタンスが格納された変数)」の後に「.」をつけてアクセスしたいインスタンス変数を記述します。

凡例
1class Sample:
2    def __init__(self,name):
3        self.name = name
4 
5#インスタンスの生成
6sample1 = Sample("田中")
7sample2 = Sample("加藤")
8 
9#インスタンス変数の呼び出し
10print('sample1:',sample1.name)
11print('sample2:',sample2.name)
実行結果
1sample1: 田中
2sample2: 加藤

凡例のイメージを表すと下記の図の通りになります。

図 4.1.1: インスタン変数へのアクセス

2. クラスの内部からアクセスする場合

クラスの内部(他のメソッド)から、インスタンス変数へアクセスするためには、そのメソッドの第一引数の後に「.」をつけてアクセスしたいインスタンス変数を記述します。
第4章でお伝えした通り、Pythonではコンストラクタを作った場合、他のメソッドでは第一引数を指定しないとエラーになるので気を付けてください。
またコンストラクタ以外のメソッドの第一引数に「self」を用いることが一般的ですので、このテキストでは以下、「self」で統一させていただきます。

書式:クラス変数へのアクセス(クラス内)
1class クラス名:
2 
3    def __init__(self,引数①,引数②,…):
4        self.インスタンス変数① = 引数①
5        self.インスタンス変数② = 引数②
6        
7    def メソッド名(self)
8        print(self.インスタンス変数①)
9        print(self.インスタンス変数②)
凡例
1class Sample:
2    def __init__(self,name1,name2):
3        self.name1 = name1
4        self.name2 = name2
5 
6    def callName(self):
7        print('名前①:',self.name1)
8        print('名前②:',self.name2)
9 
10#インスタンスの生成
11sample1 = Sample('田中','加藤')
12 
13#メソッドを介してインスタンス変数の呼び出し
14sample1.callName()
実行結果
1名前①: 田中
2名前②: 加藤

4.1.2 インスタンス変数の特徴②:インスタンスごとに独立している

インスタンス変数は、同じクラスから生成されたインスタンスでも、インスタンスごとに独立して扱うことができ、インスタンス変数の値はインスタンスごとに独立した(異なる)値を、持たせることができます。

凡例

1class Sample:
2 
3    def __init__(self,name):
4        self.name = name
5 
6#インスタンスの生成
7sample1 = Sample('田中')
8sample2 = Sample('加藤')
9 
10#インスタンス変数の呼び出し
11print('sample1:',sample1.name)
12print('sample2:',sample2.name)

実行結果

1sample1: 田中
2sample2: 加藤

凡例のイメージを図に表すと下記の通りになります。凡例のクラスSampleからsample1、sample2の二つのインスタンスを生成し、それぞれインスタンス変数nameには別々の値、「田中」、「加藤」を代入しましたが、sample1、sample2を介してnameを呼び出すと、別々の値が代入されています。
インスタンス変数nameは、インスタンスごとに独立した変数として扱うことができることがわかります。

図 4.1.2: インスタンスごとのインスタンス変数へのアクセス

4.1.3 インスタンス変数の特徴③:初期値を設定する

続いてインスタンス変数には初期値を設定することもできます。この場合、コンストラクタの引数を設定する際に、「引数名=初期値」と記載することで、インスタンス変数に初期値が設定されます。

書式

クラス外からインスタンス変数へアクセスする方法は「インスタンス名(インスタンスが格納された変数)」の後に「.」をつけてアクセスしたいインスタンス変数を記述します。

1class クラス名:
2 
3    def __init__(self,引数①=初期値①,引数②=初期値②,…):
4        self.インスタンス変数① = 引数①
5        self.インスタンス変数② = 引数②

引数を指定する場合、通常、インスタンスを生成する場合、引数の値を指定しなければなりませんでしたが、初期値が設定されている場合、引数の値を省略することができます。
またコンストラクタの引数に初期値が設定されたクラスにおいて、インスタンス生成時に引数の値を指定した場合、指定した値がそのまま引数に設定されます。

凡例

1class Sample:
2 
3    def __init__(self,name1='田中',name2='加藤'):
4        self.name1 = name1
5        self.name2 = name2
6 
7    def callName(self):
8        print('名前①:',self.name1)
9        print('名前②:',self.name2)
10 
11#インスタンスの生成
12sample1 = Sample()
13sample2 = Sample('鈴木','佐藤')
14 
15#メソッドを介してインスタンス変数の呼び出し
16sample1.callName()
17sample2.callName()

実行結果

1名前①: 田中
2名前②: 加藤
3名前①: 鈴木
4名前②: 佐藤

ポイント

  • インスタンス変数はインスタンス自身に関連付けられる為、インスタンスを生成してアクセスする必要がある。
  • インスタンス変数はオブジェクト毎に個々として独立する。

NEXT>> 4.2 クラス変数の概念

f