変数やメソッドへのアクセス方法について

2.3 変数やメソッドへのアクセス方法について

クラスを利用しオブジェクトを生成する方法について前節で学習してきました。しかしオブジェクトを生成しただけでは本当にクラスを最大限利用したことにはなりません。オブジェクトに定義されている「変数やメソッド」を利用してこそ本来の意味があります。では実際に変数やメソッドへのアクセス方法について学習していきましょう。

2.3.1 インスタンス変数/メソッドへのアクセス方法

生成されたオブジェクトの変数にアクセスする場合には「.」(ドット)を使ってアクセスします。
まずはその基本構文を見てみましょう。

書式:インスタンス変数へのアクセス方法

書式:メソッドへのアクセス方法

凡例:変数とメソッドへのアクセス方法

2.2.1項で定義した「Computer」クラスを例にしています。
下記のように「Computer」オブジェクトを1つ生成すると、コンピュータ1台のメモリの設定や音を鳴らすといった、そのオブジェクトのインスタンス変数やメソッドへのアクセスができるようになります。
生成したオブジェクトは「os、cpu、memory」という値を格納できる変数(属性)と、「起動、終了、音を鳴らす」などが行えるメソッド(操作)を持ちます。値を設定したい場合は、この変数(属性)へ実際に値を代入し、何か動作をさせたければメソッド(操作)を利用すれば良いのです。

1#オブジェクト生成
2com = Computer()
3#インスタンス変数「os」へアクセス
4com.os = ‘windows’
5#メソッド「start」へアクセス
6com.start()

「com.os」と記述すれば、comがさす「コンピュータ」オブジェクトのOSを表すことができ、「com.start()」と記述すれば起動という操作が行えることになります。

またOSをMacにしたい場合は下記ように代入することができます。

1#インスタンス変数「os」の値を変更
2com.os = ‘Mac’

それでは、次の項にて実際に変数へアクセスするサンプルを紹介します。

ソース・フォルダー: /Desktop/Python基礎講座
ファイル名: 第2章.ipynb
アクセスURL: http://localhost:8888/notebooks/Desktop/Python基礎講座/第2章.ipynb

1class Computer:
2    #変数の宣言
3    def __init__(self):
4         self.os = 'Windows'
5         self.cpu = 'Core i9'
6         self.memory = 32
7 
8com = Computer()
9print('パソコンのOSは',com.os,'です。')
10print('パソコンのCPUは',com.cpu,'です。')
11print('パソコンのメモリは',com.memory,'GBです。')
12 
13com.os = 'Mac'
14com.memory = 22
15print(‘【別の値を代入後の出力結果】’)
16print('パソコンのOSは',com.os,'です。')
17print('パソコンのメモリは',com.memory,'GBです。')

実行結果

1パソコンのOSは Windows です。
2パソコンのCPUは Core i9 です。
3パソコンのメモリは 32 GBです。
4【別の値を代入後の出力結果】
5パソコンのOSは Mac です。
6パソコンのメモリは 22 GBです。

解説

1~5行目でos、cpu、memoryという変数のみを持つクラス「Computer」が定義されています。7行目で変数comを介して、オジェクトを生成し代入しています。

9~11行目でcomオブジェクトの変数「os」、「cpu」、「memory」にアクセスし、print関数で出力しています。

1print('パソコンのOSは',com.os,'です。')
2print('パソコンのCPUは',com.cpu,'です。')
3print('パソコンのメモリは',com.memory,'GBです。')

9~11行の処理をイメージで表現すると、以下の図2.3.1のようになります。

図 2.3.1: インスタンス変数値のアクセス②

その後、13、14行目で、再びcomオブジェクトの変数「os」、「memory」にアクセスし、osには「Mac」、memoryには「22」を格納します。

13、14行の処理をイメージで表現すると、以下の図 2.3.2のようになります。

図 2.3.2: インスタンス変数へ値の格納

16、17行目でcomオブジェクトの変数「os」と「memory」にアクセスし、各値を表示しています。

1print('パソコンのOSは',com.os,'です。')
2print('パソコンのメモリは',com.memory,'GBです。')

16、17行目の処理をイメージで表現すると、以下のようになります。

図 2.3.3: インスタンス変数値のアクセス②

2.3.3 メソッドについて

メソッドは関数ですので、当然、戻り値や引数を指定することができ、様々な目的に合わせクラスでは複数のメソッドを定義することができます。
メソッドへのアクセス方法に関する書式は「オブジェクト変数.メソッド名」でしたが、以下でアクセス方法に関する凡例を確認していきましょう。

凡例:メソッドの呼び出し

1class Computer2:
2    def __init__(self):
3        self.os = 'Windows'
4        self.memory = 32
5 
6    def start(self):
7        print('起動しました。')
8 
9    def finish(self):
10        print('終了しました。')
11 
12com = Computer2()
13com.start()
14com.finish()

実行結果

1起動しました。
2終了しました。

12行目の「com = Computer2」の処理をイメージで表現すると、以下のようになります。

図 2.3.4: メソッドありオブジェクトの生成

これまでとは違いメソッドが定義されています。オブジェクトを生成することでメソッドにアクセスし利用が可能になります。

13、14行目でstart()とfinish()の各メソッドを実行しています。
13、14行目の処理をイメージで表現すると、以下の図のようになります。

①13行目:「com.start()」、と記述し、変数comに格納されているオブジェクトの場所情報からstartメソッドにアクセスします。アクセス後は処理がstartメソッド内に移ります
②14行目:「com.finish()」、と記述し、変数comに格納されているオブジェクトの場所情報からfinishメソッドにアクセスします。アクセス後は処理がfinishメソッド内に移ります。

図 2.3.5: オブジェクトからメソッドを呼び出す

2.3.4 引数、戻り値を指定したメソッドのプログラム

続いて戻り値を指定したメソッド含むクラスから、インスタンス(オブジェクト)を生成し、そこから引数を指定しメソッドを実行し、戻り値を変数に格納し、出力するプログラムを確認していきましょう。

ソース・フォルダー: /Desktop/Python基礎講座
ファイル名: 第2章.ipynb
アクセスURL: http://localhost:8888/notebooks/Desktop/Python基礎講座/第2章.ipynb

1class add_cls:
2    def __init__(self):
3        self.os = 'Windows'
4        self.memory = 32   
5 
6    def add(self,num1,num2):
7        return num1+num2
8 
9num = add_cls()
10num_add = num.add(3,4)
11print(num_add)

実行結果

解説

1~7行目で戻り値を返すメソッドを持つクラス「add_cls」が定義されています。

1class add_cls:
2    def __init__(self):
3        self.os = 'Windows'
4        self.memory = 32
5 
6    def add(self,num1,num2):
7        return num1+num2

6行目で変数numにインスタンスを生成し代入しています。

図 2.3.6:メソッドありオブジェクトの生成

続いて7行目で変数num_addを新たに宣言し、オブジェクトを含む変数numを介してクラス「add_cls」から呼び出したメソッドadd(num,num2)を引数3,4を順に指定した状態で、変数num_addに代入しています。

代入したタイミングで、メソッドのadd(num1,num2)は実行され、このメソッドは戻り値を返すので、num_addにはadd(3,4)の戻り値がそのまま代入されます。

図 2.3.7: オブジェクトからメソッドを呼び出す

8行目で7が格納されたnum_addを出力します。

これまで扱ってきたクラス内で利用する変数は全て、クラス内で値が代入された状態で宣言されていました。変数に格納する値が事前に決まっていないことが多いでしょう。
もちろんこれまで作成したクラスで宣言した変数に、オブジェクト生成後に別の値を代入できますが、同一のプログラム内で、共通のクラスを介して別々のオブジェクト(インスタンス)を生成した場合、オブジェクトごとに別々の値を変数(属性値)に持たせたい場合に適しません。
これは今まで使ってきた変数をクラス変数と呼び、このクラス変数がオブジェクト間で変数が共有される性質があるからです。

これらの問題を払しょくするためには、コンストラクタ(変数の初期化)という概念が必要になり、次章で紹介します。
またクラス変数について詳しくは第5章で紹介します。


NEXT>> 2.4 本章のまとめ

f