今回は、Pythonのクラス初期化(init)の基本概念と使い方についてご紹介します。
クラス初期化(init)とは
Pythonのクラスでは、インスタンスを生成する際に__init__という特別なメソッドを呼び出します。
この__init__メソッドは、インスタンス生成時の初期化処理を行うために使われます。
具体的には、インスタンスごとに必要な属性を設定したり、初期値を用意したりする役割があります。
ここで重要なのは、必ず最初の引数にselfを取ることです。
initの基本的な使い方
クラスを定義する際は、class クラス名: の中に__init__メソッドを定義します。
例えば、以下のように書くことで、クラスに属性を持たせることができます。
1 2 3 4 5 6 7 8 |
class SampleClass: def __init__(self, x, y): # xとyをインスタンスの属性として初期化 self.x = x self.y = y def show_values(self): print(f"x = {self.x}, y = {self.y}") |
ここでは、self.xやself.yとすることで、生成されたインスタンスごとに異なる値を保持できます。
クラスを使うには、以下のように書きます。
1 2 3 4 5 |
# インスタンス生成 obj = SampleClass(10, 20) # メソッドの呼び出し obj.show_values() # x = 10, y = 20 と表示される |
initを使った具体例
1. シンプルなクラス例
最初に、Personというクラスを定義します。
名前と年齢を管理し、自己紹介を行うメソッドを用意します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Person: def __init__(self, name, age=0): # インスタンスの属性を初期化 self.name = name self.age = age def introduce(self): # 自己紹介を出力するメソッド print(f"私の名前は {self.name} です。年齢は {self.age} 歳です。") # インスタンスの生成とメソッドの呼び出し p1 = Person("太郎", 20) p2 = Person("花子") p1.introduce() p2.introduce() |
私の名前は 太郎 です。年齢は 20 歳です。
私の名前は 花子 です。年齢は 0 歳です。
2. 入力値の検証を行うクラス例
次に、初期残高に制限を設ける銀行口座のクラスを例示します。
初期残高がマイナスにならないように、ValueErrorを発生させる仕様を加えています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
class BankAccount: def __init__(self, owner, balance=0): self.owner = owner # 初期残高は0以上でなければならない if balance < 0: raise ValueError("初期残高は0以上でなければなりません。") self.balance = balance def deposit(self, amount): if amount > 0: self.balance += amount else: print("預け入れ額は正の数でなければなりません。") def withdraw(self, amount): if 0 < amount <= self.balance: self.balance -= amount else: print("引き出し額が不正です。") # インスタンスの生成とメソッドの呼び出し account = BankAccount("Alice", 1000) account.deposit(500) account.withdraw(300) print(f"{account.owner}さんの残高は {account.balance} 円です。") |
Aliceさんの残高は 1200 円です。
3. 継承とsuper()を使ったinitの拡張例
既存のクラスを継承し、共通部分を再利用しながら追加の属性を設定する例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
class Employee: def __init__(self, name, salary): self.name = name self.salary = salary def show_info(self): print(f"{self.name} の給料は {self.salary} 円です。") class Manager(Employee): def __init__(self, name, salary, department): # 親クラスの__init__を呼び出して共通部分を初期化 super().__init__(name, salary) self.department = department def show_info(self): super().show_info() print(f"部署: {self.department}") # インスタンス生成とメソッドの呼び出し m = Manager("佐藤", 500000, "営業部") m.show_info() |
佐藤 の給料は 500000 円です。
部署: 営業部
よくあるエラーや注意点
クラスの__init__メソッドを使う際には、いくつか知っておきたいポイントがあります。
- selfの使用必須: インスタンスメソッド(__init__含む)では、第一引数をselfとすることが規約です。
- ミュータブルなデフォルト引数: listやdictなどをデフォルト引数に設定すると、複数インスタンスで同じオブジェクトが共有される場合があります。必要に応じてNoneを使って対策するのがおすすめです。
- エラーチェック: __init__で受け取った値が不正な場合は、例外を発生させるなどして安全な初期化を行います。
- super()の利用: 継承を使う際は、親クラスの初期化を再利用したいときにsuper()を活用します。
まとめ
__init__メソッドは、インスタンス生成時の重要な初期化処理を担当します。
必要な属性の設定やエラーチェックなどを含めることで、信頼性の高いコードを構築できます。
また、継承やsuper()と組み合わせることで、コードの再利用性をさらに高められます。