Day 23:オブジェクト指向入門の「最初の一歩」を踏み出す
Day 23では、Pythonのオブジェクト指向の入り口として、 クラス・インスタンス・__init__・属性・メソッド をじっくり学んでいきます。 「難しい理論」よりも、「コードとしてどう書くと何が起きるのか」を体で覚えることを目標にします。
クラスとは何かをイメージする
クラスは「設計図」、インスタンスは「実物」
オブジェクト指向では、よく次のように説明されます。
- クラス:オブジェクトの「設計図」
- インスタンス:その設計図から作られた「実物」
例えば、「ユーザー」という概念をプログラムで扱いたいとします。
- ユーザーには「名前」や「メールアドレス」がある
- ユーザーは「自己紹介する」「メールを送る」といった振る舞いを持つ
こうした「データ」と「振る舞い」をひとまとめにしたものが、クラスです。
最初のクラスを書いてみる
シンプルなUserクラス
まずは、最もシンプルなクラスを書いてみます。
class User:
"""ユーザーを表すクラスです。"""
def __init__(self, name, email):
# __init__ は「インスタンスが作られたときに呼ばれる特別なメソッド」です。
# self は「これから作られるインスタンス自身」を指します。
self.name = name # インスタンスの「属性」として name を保存します。
self.email = email # インスタンスの「属性」として email を保存します。
def introduce(self):
"""ユーザーが自己紹介するメソッドです。"""
print(f"こんにちは、{self.name}です。メールアドレスは {self.email} です。")
Pythonここで出てきた重要なキーワードを整理します。
class User:Userという名前のクラス(設計図)を定義しています。
__init__メソッド- インスタンスが作られた瞬間に呼ばれる「初期化用の特別メソッド」です。
selfは「そのインスタンス自身」を指します。
- 属性(
self.name・self.email)- インスタンスが持つ「データ」です。
- メソッド(
introduce)- インスタンスが持つ「振る舞い(関数)」です。
インスタンスを作る:設計図から「実物」を生み出す
クラスからインスタンスを生成する
クラスを定義しただけでは、まだ「設計図」があるだけです。 実際に使うためには、「インスタンス(実物)」を作ります。
# Userクラスからインスタンスを作ります。
user1 = User("Alice", "alice@example.com")
user2 = User("Bob", "bob@example.com")
# メソッドを呼び出します。
user1.introduce()
user2.introduce()
Python実行すると、次のような出力になります。
こんにちは、Aliceです。メールアドレスは alice@example.com です。
こんにちは、Bobです。メールアドレスは bob@example.com です。
ここでの重要ポイントは、
User("Alice", "alice@example.com")と書いた瞬間に、__init__が呼ばれていることself.name = nameによって、「インスタンスごとに違う名前」が保存されていることuser1.introduce()とuser2.introduce()が、それぞれのインスタンスの状態に応じて動いていること
です。
init をもう少し深く理解する
「インスタンスの初期設定」をまとめる場所
__init__ は、インスタンスが作られたときに必ず呼ばれる特別なメソッドです。 ここで「そのインスタンスが持つべき初期状態」をまとめて設定します。
class Product:
"""商品を表すクラスです。"""
def __init__(self, name, price, stock=0):
# name: 商品名
# price: 価格
# stock: 在庫数(省略された場合は0)
self.name = name
self.price = price
self.stock = stock
def show_info(self):
"""商品情報を表示するメソッドです。"""
print(f"商品名: {self.name}")
print(f"価格: {self.price} 円")
print(f"在庫数: {self.stock} 個")
Pythonインスタンスを作ってみます。
p1 = Product("ノートPC", 120000, stock=5)
p2 = Product("マウス", 2000) # stockを省略すると0になります
p1.show_info()
p2.show_info()
Pythonここでのポイントは、
__init__の引数に「デフォルト値(stock=0)」を設定できること- インスタンスごとに「属性の値」が変わること
- 「インスタンスの初期状態」を1箇所にまとめておけること
です。
属性:インスタンスが「覚えている情報」
属性にアクセスする
属性は、「インスタンスが持っているデータ」です。 self.xxx として定義したものは、インスタンスから インスタンス.xxx でアクセスできます。
user = User("Charlie", "charlie@example.com")
print(user.name) # Charlie
print(user.email) # charlie@example.com
Python属性を書き換える
インスタンスの属性は、後から書き換えることもできます。
user = User("Charlie", "charlie@example.com")
user.email = "charlie@new-domain.com" # メールアドレスを更新します
user.introduce()
Python属性を書き換えることで、
- 「ユーザー情報を更新する」
- 「商品の在庫数を増減する」
といった操作を自然に表現できます。
メソッド:インスタンスが「できること」
メソッドは「インスタンスに紐づいた関数」
メソッドは、クラスの中に定義された関数で、 インスタンスに対して「何かの処理」を行うためのものです。
class Counter:
"""カウンターを表すクラスです。"""
def __init__(self, start=0):
self.value = start # 現在の値
def increment(self):
"""カウンターを1増やします。"""
self.value += 1
def reset(self):
"""カウンターを0にリセットします。"""
self.value = 0
def show(self):
"""現在の値を表示します。"""
print(f"現在の値: {self.value}")
Pythonインスタンスを使ってみます。
counter = Counter(start=10)
counter.show() # 現在の値: 10
counter.increment() # 1増やす
counter.increment() # さらに1増やす
counter.show() # 現在の値: 12
counter.reset() # 0にリセット
counter.show() # 現在の値: 0
Pythonここでの重要ポイントは、
- メソッドの第一引数は必ず
selfであること - メソッドの中で
self.valueを操作することで、「そのインスタンスの状態」を変えていること - 「データ(属性)」と「振る舞い(メソッド)」がひとまとまりになっていること
です。
クラスを使った「ちょっと実用的な」例
ToDoタスクをクラスで表現する
Day 14で扱ったCLI型ToDoアプリを、クラスで表現するイメージです。
class Task:
"""ToDoタスクを表すクラスです。"""
def __init__(self, title, done=False):
self.title = title # タスクのタイトル
self.done = done # 完了フラグ(True/False)
def complete(self):
"""タスクを完了状態にします。"""
self.done = True
def reopen(self):
"""タスクを未完了状態に戻します。"""
self.done = False
def show(self):
"""タスクの状態を表示します。"""
status = "✔" if self.done else "✗"
print(f"[{status}] {self.title}")
Pythonインスタンスを使ってみます。
task1 = Task("Pythonの勉強をする")
task2 = Task("メールを返信する", done=True)
task1.show() # [✗] Pythonの勉強をする
task2.show() # [✔] メールを返信する
task1.complete()
task1.show() # [✔] Pythonの勉強をする
Pythonこのように、
- タスクという「概念」をクラスとして表現し
- タスクごとの状態(完了/未完了)を属性として持ち
- 完了・再オープン・表示といった振る舞いをメソッドとして持たせる
ことで、「コードの中に小さな世界」を作ることができます。
Day 23ミニテンプレート:オブジェクト指向入門スクリプト
最後に、Day 23で学んだ内容をまとめて試せる「オブジェクト指向入門スクリプト」のテンプレートを示します。
# day23_oop_intro.py
# オブジェクト指向入門の練習用スクリプト
class User:
"""ユーザーを表すクラスです。"""
def __init__(self, name, email):
# インスタンス生成時に呼ばれます。
self.name = name
self.email = email
def introduce(self):
"""自己紹介を表示するメソッドです。"""
print(f"こんにちは、{self.name}です。メールアドレスは {self.email} です。")
class Counter:
"""カウンターを表すクラスです。"""
def __init__(self, start=0):
self.value = start
def increment(self):
"""カウンターを1増やします。"""
self.value += 1
def reset(self):
"""カウンターを0にリセットします。"""
self.value = 0
def show(self):
"""現在の値を表示します。"""
print(f"現在の値: {self.value}")
def main():
print("=== Userクラスの例 ===")
user1 = User("Alice", "alice@example.com")
user2 = User("Bob", "bob@example.com")
user1.introduce()
user2.introduce()
print("\n=== Counterクラスの例 ===")
counter = Counter(start=10)
counter.show()
counter.increment()
counter.increment()
counter.show()
counter.reset()
counter.show()
if __name__ == "__main__":
main()
PythonDay 23のまとめ
Day 23では、オブジェクト指向入門として、
- クラス=「設計図」、インスタンス=「実物」というイメージ
__init__でインスタンスの初期状態をまとめて設定する考え方- 属性で「インスタンスが覚えている情報」を表現する方法
- メソッドで「インスタンスができること」を表現する方法
- 小さな例(User・Product・Counter・Task)を通して、クラスの役割を体感すること
をステップバイステップで学んでいただきました。
ここまで来ると、「データと振る舞いをひとまとめにして、コードの中に小さな世界を作る」というオブジェクト指向の感覚が少し育っているはずです。 この感覚は、今後の実践Python編で、より大きなアプリケーションやツールを設計していくうえで、とても重要な土台になっていきます。
