PR

特殊なインスタンスメソッド __init__ を初心者にもわかりやすく解説!

大草原で青空の下、男性が寝そべりながらパソコンで学習している様子 python

目次

1. 特殊なインスタンスメソッド __init__ とは?

Pythonのクラスには、特別な役割を持つ__init__というメソッドがあります。このメソッドは、クラスからインスタンス(オブジェクト)を作るときに自動で動き、インスタンスを初期化するための処理をしてくれます。

簡単に言うと、__init__は「インスタンスを作る準備をするところ」です。この準備では、例えば商品の名前や価格など、そのインスタンスに必要なデータを設定します。

このメソッドを使うと、初期設定がスムーズに行えるので、コード全体が短く、わかりやすくなります。

次の章では、__init__ を使わない場合使う場合の違いを実際のコードで比較しながら説明しますので、ぜひ続きをご覧ください!

2. インスタンス変数に値を代入する方法

__init__ を使わずに手動でインスタンス変数を設定する場合、以下のような方法があります。

class Horse:
  # クラスの定義のみ
  pass

horse1 = Horse() # Horseクラスのインスタンスを設定
horse1.name = 'エリキング' # 馬名を手動で設定
horse1.gender = '牡' # 性別を手動で設定

print(f'{horse1.name}は{horse1.gender}です') # 出力: エリキングは牡です

この方法では、インスタンスを生成した後に属性を個別に設定する必要があります。これによりコードが冗長になり、複数のインスタンスを作成する際に非効率的になるという欠点があります。

ひとつひとつインスタンス変数を作るのは手間がかかりますよね。例えば、飲食店のメニューを作るシステムで、全ての商品を個別に初期化するのは現実的ではありません。次章ではこの手間を省くための __init__ メソッドを活用した効率的な方法をご紹介します。

3. __init__ メソッドに引数を渡す方法

__init__ メソッドを使うことでインスタンス生成時に自動的に引数を渡し、初期化することができます。以下のコード例では、馬名と性別をインスタンス生成時に引数として渡します。

class Horse:
    def __init__(self, name, gender):
        # インスタンス生成時に自動で馬名と性別を設定
        self.name = name
        self.gender = gender

    def info(self):
        return f'{self.name}は{self.gender}です'

horse1 = Horse('エネルジコ', '牡')
print(horse1.info())  # 出力: エネルジコは牡です

この方法により、初期化処理が簡潔になり、柔軟性が向上します。複数のインスタンスを素早く効率的に作成できるため、ますます便利です。

ポイント__init__なし__init__あり
初期化処理の場所手動で各インスタンス変数を設定する必要がある。クラス内で実行。簡潔。
使いやすさ手間が増える。
可読性が低い。
スムーズ。
コードが短い。
複数インスタンスの作成個別に設定する必要があり手間がかかる。初期化をまとめて記述できて効率的。

よりコードが長く複雑になってくると、__init__ の便利さがさらに際立ちますね。同じ構造を持つ複数のインスタンスを効率的に生成できるので、プログラムの規模が大きくなるほど活用する利点が増していきます。

4. 演習問題で理解を深めよう!

問題1: init を使わない場合

以下のコードを完成させて、インスタンスの属性を手動で設定してください。問題には、”商品名” と “価格” を設定する必要があります。最後に、print() を使って f'{馬名}は{性別}です' の形式で商品の情報を出力してください。

class Horse:
    pass

# インスタンスを生成し、属性を設定
horse1 = Horse()
# ここにコードを追加してください

# 馬情報を出力
print(f'{horse1.name}は{horse1.gender}です')
<出力>
ショウヘイは牡です
class Horse:
    pass

horse1 = Horse()
# 解答
horse1.name = 'ショウヘイ'
horse1.gender = '牡'

print(f'{horse1.name}は {horse1.gender}です')

問題2: init を使う形(引数を使わずに馬名と性別を設定する)

クラス MenuItem を作成し、__init__ メソッドを使って商品名と価格を設定してください。ただし、引数は使わず、固定値として “ピザ” と 1000 を設定してください。インスタンスを生成した後、print() を用いて直接商品名と価格を出力するコードを完成させましょう。

class MenuItem:
    def __init__(self):
        # ここに商品名と価格を設定するコードを書いてください

# インスタンスを生成
menu_item = MenuItem()
# 商品名と価格を出力
# 下にコードを追加してください
<出力>
ピザ:¥1000
class MenuItem:
    def __init__(self):
        self.name = "ピザ"  # 商品名を設定
        self.price = 1000  # 価格を設定

# インスタンスを生成
menu_item = MenuItem()

# 商品名と価格を出力
print(f'{menu_item.name}:¥{menu_item.price}')
# 出力: ピザ:¥1000

問題3: init を使う形(引数を使ってカスタマイズする)

クラス MenuItem を作成し、__init__ メソッドを使って馬名と性別を自由に設定できるようにしてください。生成したインスタンスに対して直接 print() を使い、馬名と性別を出力するコードを完成させましょう。例として、’レッドバンテ’, ‘牡’ を設定したインスタンスを作成して、次の形式で馬情報を出力してください。

class Horse:
    def __init__(self, name, gender):
        # ここに馬名と性別を設定するコードを書いてください

# インスタンスを生成
menu_item = MenuItem("レッドバンテ", '牡')

# 下に馬情報を出力するコードを書いてください
<出力>
レッドバンテは牡です
class Horse:
    def __init__(self, name, gender):
        self.name = name # 馬名を設定
        self.gender = gender # 性別を設定
    def info(self):
        return f'{self.name}は{self.gender}です'
# インスタンスを生成
horse1 = Horse('レッドバンテ', '牡')
print(horse1.info()) #馬情報を出力

5. まとめ

__init__ メソッドを活用することで効率的にインスタンスを初期化する方法を学びました。このメソッドを利用することでコードの冗長性を避け、より簡潔で読みやすいプログラムが作成できます。

コメント

タイトルとURLをコピーしました