基礎から学ぶPython入門 90日コース | 実践Python - Day 23:オブジェクト指向入門

90日で身につけるPython
スポンサーリンク
スポンサーリンク

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.nameself.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()
Python

Day 23のまとめ

Day 23では、オブジェクト指向入門として、

  • クラス=「設計図」、インスタンス=「実物」というイメージ
  • __init__ でインスタンスの初期状態をまとめて設定する考え方
  • 属性で「インスタンスが覚えている情報」を表現する方法
  • メソッドで「インスタンスができること」を表現する方法
  • 小さな例(User・Product・Counter・Task)を通して、クラスの役割を体感すること

をステップバイステップで学んでいただきました。

ここまで来ると、「データと振る舞いをひとまとめにして、コードの中に小さな世界を作る」というオブジェクト指向の感覚が少し育っているはずです。 この感覚は、今後の実践Python編で、より大きなアプリケーションやツールを設計していくうえで、とても重要な土台になっていきます。

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