Developer

【Python独学】初期化メソッドとインスタンス変数の定義
2021.03.01
Lv1

【Python独学】初期化メソッドとインスタンス変数の定義

Pythonは、オブジェクト指向と呼ばれるプログラミング言語の一つです。
今回は、初期化メソッドとインスタンス変数の定義に関する基本的な部分を紹介します。


初期化メソッドとインスタンス変数の定義

クラスとは、「属性」と「実行できること」が記載された設計図のようなものでした。
今回は「属性」について関係する初期化メソッドとインスタンス変数というものに関して触れていきますが、
バイクを生み出すことを例として見ていきたいと思います。

「属性」は、変数で定義されます。
クラスで定義されるような属性とはどのようなものか、という例を見てみましょう。

以下では、乗り物のバイクに関するクラスを定義してみます。
MotorBikeクラスと命名してみます。

それでは、このMotorBikeクラスにはどのような属性があると思いますか?

一度、現実のバイクを想像してみてください。
“属性”という言葉でピンと来ない方は”特徴”という言葉で考えたらわかりやすいかもしれません。

バイクの属性としては、パッと思い浮かぶのは次のようなものでしょうか。
・色
・排気量
・走行距離

他にも、大きさやら形やらメーカー等も属性と呼べますね。

MotorBikeクラスという設計図からは、上記のような属性を持ったインスタンスが生み出されるという形になります。

それでは実際にクラスを定義する前に、まずは書式を確認しておきましょう。。
クラス定義には、インスタンスが作成された際に実行される”初期化メソッド”を書くことが出来ます。
この初期化メソッドが実行されることで、上記のような色やら排気量、走行距離などの変数(この変数を、インスタンス変数と呼びます)に具体的な初期値を代入することが出来ます。

class クラス名:
    def __init__(self,引数2,引数3,引数4,・・・) :   #初期化メソッド
        self.変数名1 = 初期値                   #インスタンス変数の初期化
        self.変数名2 = 初期値                   #インスタンス変数の初期化
                 ・・・

2,3,4行目にあるselfは、インスタンス自身の参照、ということを意味しています。
2行目では、初期化メソッドの第一引数としてselfが入ります。
3,4行目では、自身のもつ属性に値を代入するためにselfが使用されます。
それではMotorBikeクラスと初期化メソッドを定義してみましょう。

class MotorBike:
    def __init__(self,color = "black", displacement = "750CC") :   #初期化メソッド
        self.color = color                   #引数で受け取ったcolorの値を代入
        self.displacement = displacement     #引数で受け取ったdisplacementの値を代入
        self.mileage = 0                     #mileageは0から開始

2行目部分について、引数としてself以外には
color = “black”
displacement = “750CC”
という部分がありますね。
color(色)とdisplacement(排気量)は、引数無しでインスタンス化すると2行目の部分で書いた”black”と”750CC”がそれぞれインスタンス変数に代入されるという形になります。
引数無しでインスタンス化って何?と思われるかもしれませんね。
インスタンス化する際、例えばcolorをred(赤)としてインスタンス化したい場合には、引数として”red”を入れてあげればそれが可能になります。

2行目に引数として指定されたcolorとdisplacementに関しては、インスタンス化する際には好きな値を指定できるわけです。特に好きな値を指定しないという場合には、初期値としてある”black”と”750CC”という値がそれぞれ代入されるということです。

とはいえ、まだこの段階ではピンと来ないかもしれませんね。
では、実際に引数の無い場合とある場合でインスタンス化してみて、それぞれのインスタンスのインスタンス変数の値がどのようになっているのかを確認してみましょう。

インスタンス変数にアクセスするには、次の通りの書式で可能です。

インスタンス名.変数名

上記は、print()関数で出力することが出来ます。
では実際に見てみましょう。

#クラスの定義
class MotorBike:
    def __init__(self,color = "black", displacement = "750CC") :
        self.color = color
        self.displacement = displacement
        self.mileage = 0

#引数無しで、クラスからインスタンスを作成
bike1 = MotorBike()  #引数はなし
print(bike1.color)
print(bike1.displacement)
print(bike1.mileage)

#引数有りで、クラスからインスタンスを作成
bike2 = MotorBike("red","500CC") #colorが"red"、displacementが"500CC"になるようにインスタンス化
print(bike2.color)
print(bike2.displacement)
print(bike2.mileage)
C:\Python> python 13-2-3.py
black
750CC
0
red
500CC
0

走行距離mileageはどちらも0ですが、引数無しでインスタンス化されたbike1と、引数有りでインスタンス化されたbike2では、colorとdisplacementは異なっていますね。
ちなみに上記例では、mileageはインスタンス化する際に引数として与えることが出来ず、0という値になっていますね。これは、新車の出荷をイメージしてください。新車は当然、走行距離は0ですよね。色や排気量は製造する際に変更することは出来ますが、走行距離は0ですよね。ですので、mileageは引数として与えていないわけです。
以上が、属性を持ったインスタンスを作成する例でした。

インスタンス変数の値を更新する

上記ではインスタンス変数の値を確認しましたが、値を更新することが出来ます。

下記例では、bike1.colorがblackとなっている状態から、今回はwhiteに設定しています。

#クラスの定義
class MotorBike:
    def __init__(self,color = "black", displacement = "750CC") :
        self.color = color
        self.displacement = displacement
        self.mileage = 0

#インスタンス化
bike1 = MotorBike()  #引数はなし
print(bike1.color)

#colorの変更
bike1.color = "white" #colorに"white"を代入
print(bike1.color)
C:\Python> python 13-2-4.py
black
white

13行目でインスタンス変数colorの値を新たに代入し、14行目でprint()関数で確認のための出力をしています。
このように、後からでもインスタンス変数の値は更新することが可能です。

以上が、初期化メソッドとインスタンス変数に関する説明でした。


まとめ

クラス定義には、インスタンスが作成された際に実行される”初期化メソッド”を書くことが出来ます。
初期化メソッドが実行されることで、インスタンス変数に具体的な初期値を設定することが出来ます。
インスタンス変数にはアクセス(値の確認・更新)が可能です。


確認問題

以下のようなプログラムがあります。

class Car:
    def __init__(self,color = "White") :
        self.color = color
        self.mileage = 0

car1 = Car()
car1.color = "green"
car2 = Car("blue")

print(car1.color)
print(car2.color)

10,11行目のprint()関数での出力がどのようになるかを考えてみましょう。

答えは次回の記事の最後に!
【Python連載】インスタンスメソッドの定義

連載目次

独学で学ぶ Pythonプログラミング 連載目次