【Python入門】__init__メソッドを初心者向けに完全解説!コンストラクタの使い方と実践例
Pythonの__init__メソッドは、クラスにおいて最も重要なメソッドの一つです。コンストラクタとも呼ばれるこのメソッドは、インスタンス作成時に自動的に実行され、オブジェクトの初期化を担当します。この記事では、__init__メソッドの基本から実践的な使い方まで、初心者の方にも分かりやすく解説します。
__init__メソッドとは?
__init__メソッドは、Pythonクラスの特殊メソッド(マジックメソッド)の一つで、インスタンスが作成される際に自動的に呼び出されます。主な役割は以下の通りです:
主な役割
- インスタンス変数の初期化: オブジェクトの属性に初期値を設定
- 必要な準備処理: ファイルの読み込み、データベース接続など
- 引数の受け取り: インスタンス作成時にパラメータを受け取る
基本的な__init__メソッドの使い方
1. 最もシンプルな例
class Person:
def __init__(self):
self.name = "名無し"
self.age = 0
person = Person()
print(person.name) # 名無し
print(person.age) # 0
2. 引数を受け取る__init__メソッド
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
person = Person("田中", 25)
print(person.name) # 田中
print(person.age) # 25
3. デフォルト引数付きの__init__メソッド
class Person:
def __init__(self, name, age=20):
self.name = name
self.age = age
person1 = Person("佐藤") # age=20(デフォルト値)
person2 = Person("鈴木", 30) # age=30(指定値)
print(person1.age) # 20
print(person2.age) # 30
__init__メソッドの基本構文
class クラス名:
def __init__(self, 引数1, 引数2=デフォルト値, ...):
"""
コンストラクタ(初期化メソッド)
インスタンス作成時に自動実行される
"""
self.属性1 = 引数1
self.属性2 = 引数2
# その他の初期化処理
重要なポイント
selfは必須: 最初の引数は必ずself- 自動実行: インスタンス作成時に自動的に呼び出される
- 戻り値なし:
return文は使用しない(Noneを返す) - アンダースコア2個:
__init__(前後に2個ずつ)
実践的な__init__メソッドの例
1. 銀行口座クラス
class BankAccount:
def __init__(self, owner, initial_balance=0):
self.owner = owner
self.balance = initial_balance
self.transaction_history = []
print(f"{owner}さんの口座を開設しました")
account = BankAccount("田中", 1000)
# 田中さんの口座を開設しました
print(account.balance) # 1000
2. 学生クラス
class Student:
def __init__(self, name, student_id, grade=1):
self.name = name
self.student_id = student_id
self.grade = grade
self.subjects = []
self.scores = {}
student = Student("山田太郎", "S001", 2)
print(f"{student.name} (ID: {student.student_id})")
# 山田太郎 (ID: S001)
3. 商品クラス
class Product:
def __init__(self, name, price, category="一般"):
self.name = name
self.price = price
self.category = category
self.created_at = "2025-07-29" # 固定値の設定
product = Product("ノートPC", 80000, "電子機器")
print(f"{product.name}: {product.price}円")
# ノートPC: 80000円
__init__メソッドでの様々な初期化パターン
1. リストや辞書の初期化
class ShoppingCart:
def __init__(self, customer_name):
self.customer_name = customer_name
self.items = [] # 空のリスト
self.total_amount = 0 # 数値の初期化
self.discount_rate = 0.0 # 小数の初期化
cart = ShoppingCart("佐藤")
print(cart.items) # []
2. 他のオブジェクトを含む初期化
class Car:
def __init__(self, make, model):
self.make = make
self.model = model
self.engine_started = False
class Driver:
def __init__(self, name, car):
self.name = name
self.car = car # Carオブジェクトを属性として持つ
my_car = Car("トヨタ", "プリウス")
driver = Driver("田中", my_car)
print(driver.car.make) # トヨタ
3. 計算による初期化
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
self.area = width * height # 計算結果を保存
self.perimeter = 2 * (width + height)
rect = Rectangle(10, 5)
print(rect.area) # 50
print(rect.perimeter) # 30
エラーハンドリングと検証
1. 引数の検証
class Person:
def __init__(self, name, age):
if not name:
raise ValueError("名前は必須です")
if age < 0:
raise ValueError("年齢は0以上である必要があります")
self.name = name
self.age = age
# 正常な場合
person1 = Person("田中", 25)
# エラーが発生する場合
# person2 = Person("", 25) # ValueError: 名前は必須です
# person3 = Person("佐藤", -5) # ValueError: 年齢は0以上である必要があります
2. 型チェック
class Student:
def __init__(self, name, student_id):
if not isinstance(name, str):
raise TypeError("名前は文字列である必要があります")
if not isinstance(student_id, str):
raise TypeError("学生IDは文字列である必要があります")
self.name = name
self.student_id = student_id
student = Student("山田", "S001") # OK
# student = Student(123, "S001") # TypeError
キーワード引数を使った柔軟な初期化
1. **kwargsを使った例
class User:
def __init__(self, username, **kwargs):
self.username = username
self.email = kwargs.get('email', '')
self.age = kwargs.get('age', 0)
self.city = kwargs.get('city', '未設定')
user1 = User("tanaka")
user2 = User("sato", email="sato@example.com", age=30)
print(user1.email) # ''(空文字)
print(user2.email) # sato@example.com
2. 設定クラスの例
class Config:
def __init__(self, **settings):
self.debug = settings.get('debug', False)
self.host = settings.get('host', 'localhost')
self.port = settings.get('port', 8000)
self.database_url = settings.get('database_url', '')
config = Config(debug=True, port=3000)
print(config.debug) # True
print(config.port) # 3000
print(config.host) # localhost(デフォルト値)
よくある間違いと注意点
1. selfを忘れる
# ❌ 間違い
class Person:
def __init__(name, age): # selfが無い
self.name = name
# ✅ 正解
class Person:
def __init__(self, name, age): # selfを最初に
self.name = name
2. returnを使う
# ❌ 間違い
class Person:
def __init__(self, name):
self.name = name
return self # __init__でreturnは不要
# ✅ 正解
class Person:
def __init__(self, name):
self.name = name
# returnは書かない
3. 可変オブジェクトをデフォルト引数にする
# ❌ 危険な例
class MyClass:
def __init__(self, items=[]): # リストをデフォルト引数にしない
self.items = items
# ✅ 安全な方法
class MyClass:
def __init__(self, items=None):
self.items = items if items is not None else []
__init__メソッドのベストプラクティス
1. 明確な引数名を使用
class Rectangle:
def __init__(self, width, height): # 明確な名前
self.width = width
self.height = height
# 悪い例: def __init__(self, a, b)
2. ドキュメント文字列の追加
class Person:
def __init__(self, name, age):
"""
Personクラスのコンストラクタ
Args:
name (str): 人の名前
age (int): 人の年齢
"""
self.name = name
self.age = age
3. 適切な初期値の設定
class Counter:
def __init__(self, initial_value=0):
"""カウンターの初期値を設定"""
self.count = initial_value
self.history = [] # 常に新しいリストを作成
まとめ
__init__メソッドはPythonクラスの基礎となる重要なメソッドです。適切に使用することで、安全で使いやすいクラスを作成できます。
重要なポイント
selfを最初の引数に必ず含める- インスタンス変数の初期化に使用する
- 引数の検証でエラーを防ぐ
- デフォルト引数で柔軟性を持たせる
- 可変オブジェクトのデフォルト引数は避ける
まずは簡単な__init__メソッドから始めて、徐々に複雑な初期化処理を扱えるようになりましょう。実際にコードを書いて練習することで、__init__メソッドの使い方がしっかりと身に付きます!
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座

