コンストラクタの利用方法

3.2 コンストラクタの利用方法

では早速ですが、コンストラクタの利用方法について確認していきましょう。

3.2.1 コンストラクタの書式

まずコンストラクタを定義する上で、以下の2点は必ず守る必要があります。
① メソッド名は「__init__」になる
② 第一引数(self)を従える
③ 戻り値(return)は指定できない
これを踏まえた上で、一般的なコンストラクタの書式を確認していきましょう。

1. 一般的な書式(インスタンス変数、self以外の引数も従える場合)

以上が一般的な書式になりますが、一つ一つ解説していきます。

selfについて

selfはインスタンス(オブジェクト)自身を示すものになります。self以外のキーワードを置くことも可能ですが、慣例上、selfを使用することが一般的です。
他の人がコードを読む際、どのような内容のものなのか理解してもらうためにも、selfを指定するのが良いでしょう。

「self.変数」について

「self」、「.(ピリオド)」に続く変数を、インスタンス変数と呼びます。オブジェクト(インスタンス)ごとに、異なる値を変数に格納したい場合に、インスタンス変数を用いられ、またインスタンス変数には、コンストラクタ内部で引数の値を代入するのが一般的です。

引数について

第一引数(self)以降の、引数は省略可能ですが、引数とインスタンス変数はセットで使用するのが一般的です。
クラス内におけるインスタンス変数の数に合わせて、第二引数以降の引数の数を指定することが多く、インスタンス変数を2つ持たせる場合、self以外に2つの引数を指定し、3つ持たせる場合には3つ指定するようにしましょう。
またインスタンス変数名と代入時に使用する引数の名前を同一にするのが一般的です。

凡例

上記の凡例では、Personというクラスを定義してます。コンストラクタの内部には、self以外に、name、ageという引数をしており、インスタンス変数としてname、ageが指定されています。
インスタンス変数と引数が同じ名前になっています。が、先ほど申した通り、必ず同じにする必要はありませんが、同一にするのが一般的です。

2. コンストラクタのあるクラスからインスタンス生成する一般的な書式

以上を踏まえ、コンストラクタのあるクラスから、インスタンス(オブジェクト)生成、生成したオブジェクトからインスタンス変数を呼び出すための、一般的な書式を紹介します。

コンストラクタのあるクラスからインスタンスを生成する際に、コンストラクタの引数に代入する値(設定値)を指定するのが一般的です。
設定値は「self.インスタンス変数」に代入されるので、インスタンスごとに異なる設定値を指定すれば、インスタンス変数に異なる値を持たせることができます。
書式だけではわかりづらいと思いますので、凡例を元に解説していきます。

凡例
実行結果

2~7行目で、Personというクラスを定義しています。
Personには、self以外にname、ageという引数を指定でき、name、ageというインスタンス変数を含むコンストラクタがあります。

10行目ではperson_1という変数を宣言し、Personから引数として(‘田中’、42)を指定したインスタンスを生成し、person_1にこのインスタンスを代入しています。
この(‘田中’,42)という値はそれぞれ、このインスタンスの中のコンストラクタの引数に代入されます。
11行目も同様に、person_2という変数を宣言しており、今度はPersonから引数として(‘佐藤’、32)を指定したインスタンスを生成し、person_2にこのインスタンスを代入しています。
10,11行目の処理をイメージで表現すると、以下の図 3.2.1のようになります。

図 3.2.1: コンストラクタを含むクラスからのインスタンスの生成

14,15行目では、person_1、person_2、それぞれのインスタンスから、別々にインスタンス変数、name、 ageの値を呼び出し、出力しています。
14,15行目の処理をイメージで表現すると、以下の図 3.2.2のようになります。

図 3.2.2:インスタンス変数の取得

1. それ以外の書式の凡例

以上が一般的なコンストラクタの書式になりますが、self以外に引数を従えたり、インスタンス変数を使用しなくてもコンストラクタは作成できます。
一般的なコンストラクタの書式に沿わないコンストラクタの例を確認していきましょう。

凡例①:引数はselfだけ、インスタンス変数を使用しない
実行結果

コンストラクタはインスタンス生成時に必ず、読み込まれるメソッドです。上の凡例では変数show_sampleを介してクラスsample1から新しいインスタンスを作成しており、作成と同時にインスタンス内の「print(‘コンストラクタの開始’)」が読み込まれるため、上記のような実行結果になります。

凡例②:self以外の引数も従えるが、インスタンス変数を使用しない
実行結果

上記の例では、sample2というクラスを定義しています。sample2のコンストラクタには、self以外に引数としてtextを指定することができ、コンストラクタの処理はtextの値を出力するものです。
変数show_sample2を介して、クラスsample2からインスタンスを生成しており、引数には’引数の値を出力’を指定しています。
インスタンス生成と同時に、コンストラクタは読み込まれこの値はtextに代入されるため、「引数の値を出力」が出力されます。

凡例③:引数がselfだけ、インスタンス変数を使用する
実行結果

上記の例では、sample3というクラスを定義しています。sample3のコンストラクタの処理には、インスタンス変数text2を設けており、値として’インスタンス変数’を代入しています。
変数show_sample3を介してクラスsample3からインスタンスを生成し、このインスタンスに含まれているインスタンス変数の値を出力しています。

ポイント

  • コンストラクタを定義する際、メソッド名を「__init__」とし、第一引数(self)の設定を行う必要がある
  • インスタンス変数とは、コンストラクタ内で宣言する、「self.変数」の変数のことである。
  • インスタンス変数に合わせて、コンストラクタはself以外にインスタンス変数を宣言するのが一般的である。
  • self以外の引数とインスタンス変数を同じ名前に設定するのが一般的である。

NEXT>> 3.3 selfについて