<一覧に戻る

コンストラクタ__init__

オブジェクト指向プログラミング(OOP)の学習を始めると、必ず出てくるキーワードがコンストラクタです。 コンストラクタとは、クラスからオブジェクト(インスタンス)が生成される際に自動的に実行される特別なメソッドです。

Pythonでは、__init__メソッドがこのコンストラクタの役割を果たします。

今回は、__init__メソッドについて詳しく解説します。

__init__メソッドとは?

__init__メソッドは、クラスからオブジェクト(インスタンス)が生成される際に自動的に呼び出され、オブジェクトの初期状態を設定するために使用されます。

主にインスタンス変数の初期化に用いられ、オブジェクトごとに異なるデータを保持することが可能になります。

たとえば、人を表すクラスを作るとしたら、その人の名前や年齢といった情報を、オブジェクトが生成される瞬間に保存しておきたいですよね。

そのような処理を記述するのが__init__メソッドです。

__init__メソッドの基本構文

まずはシンプルな例から見てみましょう。 以下のコードでは、Personクラスを定義し、その中で__init__メソッドを使って「名前」と「年齢」を初期化しています。

class Person:
    def __init__(self, name, age):
        self.name = name  # インスタンス変数の初期化
        self.age = age    # インスタンス変数の初期化

    def greet(self):
        print(f"こんにちは、私の名前は{self.name}です。年齢は{self.age}歳です。")

ここで重要なのは、selfはそのオブジェクト自身を指すという点です。self.nameやself.ageに代入することで、オブジェクトごとに異なる名前や年齢を保持できます。

例えば次のようにオブジェクトを生成すると、それぞれのインスタンスに異なる値が設定されます。

#クラスの定義
class Person:
    def __init__(self, name, age):
        self.name = name  # インスタンス変数の初期化
        self.age = age    # インスタンス変数の初期化

    def greet(self):
        print(f"こんにちは、私の名前は{self.name}です。年齢は{self.age}歳です。")

# Personクラスのインスタンスを生成
person1 = Person("太郎", 25)
person2 = Person("花子", 30)

# メソッドの呼び出し
person1.greet()  # 出力: こんにちは、私の名前は太郎です。年齢は25歳です。
person2.greet()  # 出力: こんにちは、私の名前は花子です。年齢は30歳です。

このように、同じクラスから作られたオブジェクトでも、__init__を通じてそれぞれ固有の状態を持たせることができるのです。

複数の引数を使って詳細に初期化する

コンストラクタは、必要に応じて複数の引数を受け取ることができます。 例えば本を表すクラスを作る場合、タイトル、著者、出版年などを初期化しておくと便利です。

# クラスの定義
class Book:
    def __init__(self, title, author, year_published):
        self.title = title
        self.author = author
        self.year_published = year_published

    def description(self):
        return f"『{self.title}』 by {self.author}, published in {self.year_published}"

# Bookクラスのインスタンスを生成
book1 = Book("1984", "ジョージ・オーウェル", 1949)
book2 = Book("Pythonプログラミング入門", "山田太郎", 2021)

print(book1.description())  
# 『1984』 by ジョージ・オーウェル, published in 1949

print(book2.description())  
# 『Pythonプログラミング入門』 by 山田太郎, published in 2021

こうすることで、オブジェクトごとに違う初期データを柔軟に持たせることができます。

デフォルト値を設定する

__init__メソッドでデフォルト値を設定することも可能です。 これにより、引数が指定されない場合に自動的にデフォルト値が使用されます。

以下のように設定します。

# クラスの定義
class Animal:
    # 引数に初期値を設定
    def __init__(self, species, legs=4):
        self.species = species
        self.legs = legs

    def describe(self):
        print(f"種: {self.species}, 足の数: {self.legs}")

# Animalクラスのインスタンスを生成
animal1 = Animal("犬")
animal2 = Animal("鳥", legs=2)

# メソッドの呼び出し
animal1.describe()  # 出力: 種: 犬, 足の数: 4
animal2.describe()  # 出力: 種: 鳥, 足の数: 2

このように、legs=4を設定し、足の数を指定しなければ自動的に「4」が使われます。

コンストラクタ内でエラーチェックを行う

__init__メソッド内で引数の値をチェックし、エラーを発生させることができます。 これにより、オブジェクトの不正な状態を防ぐことができます。

class Rectangle:
    def __init__(self, width, height):
        # エラーチェック
        if width <= 0 or height <= 0:
            raise ValueError("幅と高さは正の数でなければなりません。")
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

# 正しいインスタンス生成
rectangle1 = Rectangle(5, 10)
print(rectangle1.area())  # 出力: 50

# 不正なインスタンス生成(エラーが発生)
rectangle2 = Rectangle(-3, 4)  # 出力: ValueError: 幅と高さは正の数でなければなりません。

ここでは、width(幅)とhight(高さ)の値が正の数かどうかを__init__メソッド内でチェックしています。 これにより、不正なオブジェクトが生成されるのを未然に防ぐことができるのです。

まとめ

Pythonのコンストラクタである__init__メソッドは、オブジェクトの初期化を担当する非常に重要な仕組みです。 今回学習した内容は以下の通りです。

  • オブジェクト生成時に自動的に呼ばれる
  • インスタンス変数を設定してオブジェクトごとに異なる状態を持たせられる
  • デフォルト引数やエラーチェックで使いやすく安全にできる

これらを理解して活用すれば、Pythonでのオブジェクト指向プログラミングの基礎をしっかり身につけることができるでしょう。

出力結果: