【Pythonを使い倒す】コンストラクタ(イニシャライザ)を活用してキレイなコードを書こう!

前回の記事では、オブジェクト指向らしいコードを書くためのインスタンスの使い方について解説をしました。今回はコンストラクトを解説します。

コンストラクタとは

インスタンスの生成時に同時にインスタンス変数を設定することができます。

以下の例では、__init__メソッドの中でインスタンス変数の設定をしています。
この__init__()はインスタンスの生成時に何もしなくても呼ばれます。
__init__()は特殊なメソッドで、コンストラクタもしくはイニシャライザと呼ばれています。

こちらの例のコードを見ていきましょう。

__init__メソッドの中でインスタンス変数の設定
class Fruit1():
    def __init__(self, ap, bn): # コンストラクタ
        self.apple = ap
        self.banana = bn
        
    def sayAP(self):
        print(self.apple, self.banana)

p1 = Fruit1("りんご", "バナナ") # インスタンスの生成 引数としてインスタンス変数の値を渡す
p1.sayAP()
実行結果

りんご バナナ

クラス Fruit1 には__init__()メソッドとsayAP()メソッドが実装されています。
このうち__init__()メソッドがコンストラクタです。

こちらのコンストラクタではインスタンス変数に受け取った引数を設定しています。
インスタンス変数は apple と banana ですね。

そしてsayAP()メソッドではselfを使って apple と banana にアクセスしプリントしています。
クラス Fruit1 からインスタンスを生成する際に引数としてインスタンス変数に設定する値を渡します。
この場合”りんご”という文字列と”バナナ”という文字列を渡しています。

このようにイニシャライザを用いるとインスタンスの生成時に値をコンストラクタに渡すことができます。
その後、sayAP()メソッドを呼び出しています。

このようにsayAP()メソッドの中でインスタンス変数の値がプリントされて”りんご”と”バナナ”と表示されました。

コントラクトを使ってインスタンス変数の値を設定することができました。
このようにコンストラクタを用いることによりインスタンスの生成とインスタンス変数の設定を同時に行うことができます。

 

インスタンスの生成時に値を渡さないとエラーとなる

以下の例ではコンストラクタを実装しているにも関わらず、インスタンスの生成時に値を渡していません。
このような場合実行するとエラーが発生します。

インスタンスの生成時に値を渡さないとエラーとなる
class Fruit2():
    def __init__(self, ap, bn):
        self.apple = ap
        self.banana = bn
        
    def sayAP(self):
        print(self.apple, self.banana)

p2 = Fruit2() # 値を渡していない
p.sayAP()
print(f1.banana) # インスタンス変数にアクセス
実行結果

—————————————————————————
TypeError Traceback (most recent call last)
in ()
7 print(self.apple, self.banana)
8
—-> 9 p2 = Fruit2() # 値を渡していない
10 p.sayAP()TypeError: __init__() missing 2 required positional arguments: ‘ap’ and ‘bn’

こちらの例のコードではクラス Fruit2 に先ほどと同じメソッドが実装されています。
しかしながら、インスタンスを生成する際に値を渡していません。

実行すると上記のようにエラーが発生しました。
インスタンスの生成時にapとbnに対応する引数を渡していないのでエラーになりました。

このようにコンストラクタで引数が設定されているにもかかわらず、インスタンスの生成時に値を渡さないとエラーが発生します。
従ってコンストラクタを用いるとインスタンス変数を確実に設定することができるので意図しない不具合の予防になります。

また、メソッドの役割が明確になり、短くて美しいコードを書くことが可能になります。

コンストラクタを伴うクラスを記述するステップ

  1. クラスからインスタンスを生成する際に、インスタンス変数の値を渡す
  2. インスタンス変数から値を渡す際にエラーになるかを確認

今回はコンストラクタを解説しました。
活用するとコードがキレイになるので是非利用していきましょう!!