インスタンスの初期化
ここまでは、インスタンス生成後にクラス変数やインスタンス変数の更新・追加する方法などを学習しました。しかし、クラス変数はすべてのインスタンスで共通の変数、インスタンス変数はそのインスタンス固有の変数であるべき、という点からも変数は慎重に扱わなければならず、このようなプログラムはあまり推奨されません。通常は、初期化メソッドという特殊なメソッドを使ってインスタンス変数を定義します。
初期化メソッド
Pythonでは初期化メソッドと呼ばれる、初期化のための特殊なメソッド__init__()
が用意されています。初期化メソッドはinit
の前後に__
(2つのアンダーバー)を付けて記述します。
def __init__( self, 引数2, 引数3,…):
初期化の処理内容
初期化メソッドはインスタンスが生成されるとき自動的に呼び出されます。
まずは、初期化メソッドがどのように実行されるか、確認してみましょう。
class Sample:
# メソッドを定義する
def __init__(self):
print("インスタンスが生成されました")
# インスタンスを生成する
s1 = Sample()
実行してみましょう。
インスタンスが生成されました
このように、処理内容は通常のメソッドと同じように定義することができますが、初期化メソッドはインスタンス生成時に呼び出され、その処理が実行されます。
クッキークラスに初期化メソッドを定義する
先ほどはクッキーインスタンス生成後にクッキーの味taste
データを設定していましたが、クッキーを生成するたびに、いちいちデータを呼び出して設定するのは手間がかかるうえに、設定を忘れる可能性もあります。また、データの種類が増えた場合はさらに大変でしょう。
そこで、インスタンス生成時に呼び出される初期化メソッドを利用して、インスタンス変数の初期値を設定します。これによって、生成時に各インスタンスへ固有のインスタンス変数を与えることができます。
では、初期化メソッドを使ってクッキークラスを定義しましょう。
class Cookie:
# クラス変数を設定する
name = "クッキー"
# 初期化メソッドでインスタンス変数を定義する
def __init__(self, taste):
self.taste = taste
# メソッドを定義する
def bake(self):
print(self.taste, self.name, "が焼けました")
# インスタンスを生成する
cookie1 = Cookie("プレーン")
cookie2 = Cookie("チョコ")
cookie3 = Cookie("チョコチップ")
# インスタンスを指定してメソッドを呼び出す
cookie1.bake()
cookie2.bake()
cookie3.bake()
実行してみましょう。
プレーン クッキー が焼けました
チョコ クッキー が焼けました
チョコチップ クッキー が焼けました
初期化メソッドによって、クッキーインスタンスの生成と同時に各クッキーの味taste
データが設定できました。
メソッドでインスタンス変数を使う
メソッド定義のself.taste
、self.name
という記述に注目してみましょう。
メソッド定義ではself
を記述することでインスタンス自身を参照します。つまりメソッド定義のself.変数名
はインスタンス変数をあらわしています。
初期化メソッドの以下の書式と、インスタンス変数を設定する書式を比較してみましょう。
def __init__(self, 引数2):
self.インスタンス変数名 = 引数2
インスタンス名.インスタンス変数名 = 値
2つの書式を比べると、初期化メソッドでインスタンス変数を設定していることがわかります。今回の場合だと、cookie1
インスタンス生成時には引数プレーン
が渡されcookie1.taste = "プレーン"
が実行されることになります。メソッド定義でインスタンス変数を呼び出す書式self.変数名
はとても重要なのでよく覚えておきましょう。
ちなみにself.taste = taste
の右側のように、引数を変数名と同じにする必要はありませんが、慣習的にこのように記述します。
また、初期化メソッドで設定する変数はインスタンス変数であって、クラス変数ではありません。例えばクッキークラスの変数としてCookie.taste
を呼び出そうとしても、存在しないためエラーになります。
なぜインスタンスの初期化が必要か
初期化メソッドを使うメリットは先述の通りですが、実際にプログラム上でオブジェクトを生成する場合、必要となるのがメモリ上の空領域です。言い換えると、クラスを基にした実際の値としてのデータ(インスタンス)を入れる領域を確保することが、インスタンスの生成です。メモリ上にインスタンスの領域が割り当てられることで実体をもったといえるのです。
ただし、領域を確保しようとしても、何も無い事を意味するnull値や0のデータが入っていたり、メモリ上の前のデータ(ゴミ)がそのまま残っていることもあります。そこで、必要になるのが初期化です。その領域を使える状態にするため、期待している値で上書きしておく必要があります。
初学者のためのPython講座 オブジェクト指向編1 オブジェクト指向とは
初学者のためのPython講座 オブジェクト指向編2 クラスとインスタンス
初学者のためのPython講座 オブジェクト指向編3 メソッド
初学者のためのPython講座 オブジェクト指向編4 初期化メソッド
随時追加予定