【Pythonを使い倒す】インスタンスの使い方を覚えて、オブジェクト指向らしいコードを書こう!

前回の記事では、オブジェクトとメソッドの書き方について解説をしました。今回はインスタンス変数を解説します。

インスタンスとは

クラスにインスタンス変数を記述すると、インスタンスが値を保持できるようになります。
selfを用いることでインスタンスの値を持たせることが可能です。
この値を格納する変数をインスタンス変数と言います。

インスタンス変数を設定する際は次のように記述します。

インスタンスの書き方
self.インスタンス変数名 = 値

以下の例ではsetFruitメソッドの中でインスタンス変数を設定しています。

メソッドの中でインスタンス変数を設定
class Fruit1:
    def setFruit(self):
        self.apple = "りんご" # インスタンス変数を設定
        self.banana = "バナナ" # インスタンス変数を設定
        
f1 = Fruit1()
f1.setFruit()

print(f1.apple) # インスタンス変数にアクセス
print(f1.banana) # インスタンス変数にアクセス
実行結果

りんご
バナナ

クラスFruit1の中にsetFruit()メソッドがありますが、この中でselfを用いてインスタンス変数を設定しています。
selfはインスタンス自身でしたね。
それにドット(.)を付けてappleというインスタンス変数に”りんご”という文字列を入れています。
同様にbananaというインスタンス変数には”バナナ”という文字列を入れています。
このようにselfを用いてインスタンス変数を設定することができます。

このFruit1クラスからインスタンスを生成します。
f1という変数に格納します。

そしてsetFruit()を呼び出してインスタンス変数を設定し、その後にインスタンスからインスタンス変数にアクセスします。
インスタンス変数appleとbananaの値をそれぞれプリントすると上記のように”りんご””バナナ”と表示されました。

インスタンス変数が設定されていることが確認できます。
また、クラスFruit1のインスタンスからインスタンス変数にアクセスすることができました。

メソッドの設定も忘れないようにしよう

また設定されていないインスタンス変数にアクセスしようとするとエラーが発生します。
以下の例では、setFruitメソッドを呼ばずにappleにアクセスしようとしているので、実行するとエラーになります。

メソッドの設定を忘れると
class Fruit2:
    def setFruit(self):
        self.apple = "りんご"
        self.banana = "バナナ"
        
f2 = Fruit2()
print(f2.apple) # appleがインスタンス変数に設定されていない
print(f2.banana)
実行結果

—————————————————————————
AttributeError Traceback (most recent call last)
in ()
5
6 f2 = Fruit2()
—-> 7 print(f2.apple) # appleがインスタンス変数に設定されていない
8 print(f2.banana)AttributeError: ‘Fruit2’ object has no attribute ‘apple’

こちらの例のコードではsetFruit()メソッドを呼んで、インスタンス変数を設定せずにappleとbananaにアクセスしようとしています。
実行すると上記のようなエラーコードが発生しました。

このように設定されていないインスタンス変数にアクセスしようとするとエラーが発生します。

1つのクラスから複数のインスタンスを生成する

1つのクラスから複数のインスタンスを生成することができます。
その場合、各インスタンスに、異なるインスタンス変数の値を設定することができます。

1つのクラスから複数のインスタンスを生成する
class Fruit3:
    def setFruit(self, ap, bn): # 引数としてapとbnを受け取る
        self.apple = ap # インスタンス変数を設定
        self.banana = bn
        
pj = Fruit3()
pj.setFruit("りんご", "バナナ") # selfは渡さなくてよい

pe = Fruit3() # pjとは異なるインスタンス
pe.setFruit("Apple", "Banana") 

print(pj.apple, pj.banana)
print(pe.apple, pe.banana)
実行結果

りんご バナナ
Apple Banana

こちらのクラスFruit3ではsetFruit()メソッドの中で ap と bn の2つの引数を受け取っています。
そして、それぞれをインスタンス変数に設定しています。

このクラスFruit3からインスタンスを生成して変数pjに入れます。
そしてsetFruit()メソッドを呼び出しますが、その際に引数として、”りんご”という文字列と”バナナ”という文字列を渡します。

この場合selfは引数として渡さなくて構いません。
しかしながら、メソッドの場合、受け取る側の第1引数として、selfを書くルールがあります。

そして、クラスFruit3からもう一つインスタンスを作ります。
生成したインスタンスをpeという変数に入れます。
これはpjとは異なるインスタンスになります。

そしてpeからsetFruit()メソッドを呼び出して今回は英語で”Apple”という文字列と”Banana”という文字列を渡します。
そしてpjとpeそれぞれのインスタンス変数をプリントします。

実行すると上記のような結果となり、pjとpeそれぞれのインスタンス変数に異なる値が設定されたことが確認できました。
繰り返しになりますが、メソッドに引数を渡す場合、渡す側にselfを記述する必要はありません。

このようなインスタンス変数の値が各インスタンスの特徴になります。

最後に手順をまとめます。

  1. クラスを記述し、その中にインスタンス変数を設定するメソッドを記述
  2. そして、このクラスから複数のインスタンスを生成し、メソッドによりインスタンス変数の値を設定
  3. また、各インスタンスのインスタンス変数の値を表示してみましょう
  4. 複数のインスタンスを生成し、それぞれに異なるインスタンス変数の値を設定

今回はインスタンス変数を解説しました。
少しずつオブジェクト指向らしいコードが書けるようになってきました。