【Python中級への道 #8】オブジェクト指向をはじめよう!クラスとインスタンスの概念

ALL

こんにちは、Tech Samuraiです!
前回の記事「【Python入門 #7】コードを整理整頓!何度でも使える部品「関数」を作ろう」では、処理を「関数」という部品にまとめる方法を学びましたね。

変数、if文、ループ、リスト、辞書、そして関数。これまでの冒険で、私たちはPythonプログラミングの基本的な部品を全て手に入れました。しかし、プログラムが大規模になってくると、たくさんの変数と関数が散らかり始め、管理が大変になってきます。

例えば、ゲームのキャラクターを考えてみましょう。player_name, player_hp, player_attackといった「データ(変数)」と、attack(), take_damage()といった「処理(関数)」がありますよね。これらは全て「プレイヤー」という一つの概念に関連していますが、今のままではバラバラに存在しています。

今回のテーマは、これらバラバラの**データと処理を、一つの大きな「設計図」の元にまとめ上げる**ための考え方、「オブジェクト指向プログラミング(OOP)」です。その第一歩として、最も重要な概念である**「クラス」**と**「インスタンス」**の世界を探検します!


クラスとオブジェクトとは? 「設計図」と「実物」

オブジェクト指向を理解するための鍵は、「クラス」と「オブジェクト(インスタンス)」という2つの言葉です。

例えるなら… 「たい焼き」です!

  • クラス (Class): これは「たい焼きの金型(かながた)」、つまり**設計図**です。
    • 金型には「あんこを入れる場所」や「生地の形」といった情報(属性)が定義されています。
    • また、「焼く」という機能(メソッド)を持っています。
  • オブジェクト (Object) / インスタンス (Instance): これは、その金型から作られた**「たい焼きそのもの」**、つまり**実物**です。
    • 一つの金型から、たくさんのたい焼き(オブジェクト)を作ることができます。
    • それぞれのたい焼きは、「あんこ味」「クリーム味」といったように、異なる中身(属性の値)を持つことができます。

プログラミングの世界でも同様に、まず「プレイヤー」というクラス(設計図)を作り、そこから「プレイヤー1(Tech Samurai)」や「プレイヤー2(Ninja Python)」といった、具体的なオブジェクト(実物)を生成していくのです。


Pythonでクラスを作ってみよう

それでは、先ほどの「プレイヤー」を例に、Pythonでクラスを定義してみましょう。

# Player という名前のクラス(設計図)を定義
class Player:
    # --- ① 初期化メソッド(コンストラクタ) ---
    # オブジェクトが生成されるときに、最初に一度だけ呼ばれる特別なメソッド
    def __init__(self, name, hp, attack_power):
        print(f"{name} がゲームの世界に召喚された!")
        # ② 属性(データ)の定義
        # self.変数名 の形で、そのオブジェクトが持つデータ(属性)を設定する
        self.name = name
        self.hp = hp
        self.attack_power = attack_power

    # --- ③ メソッド(処理)の定義 ---
    # そのオブジェクトができること(処理)を定義する
    def attack(self, target_name):
        print(f"{self.name} の攻撃!")
        print(f"{target_name} に {self.attack_power} のダメージを与えた!")

コードのポイント解説

  1. 初期化メソッド __init__:**
    これは、オブジェクトが生成される(たい焼きが焼かれる)瞬間に自動で実行される、特別なメソッドです。ここで、そのキャラクターの名前やHPといった、初期ステータス(属性)を設定します。
  2. 属性 (self.変数名):
    self.name = name のように、self. を付けて定義された変数が、そのオブジェクト固有のデータになります。
  3. メソッド (関数):
    クラスの中に定義された関数のことを「メソッド」と呼びます。attackメソッドのように、そのオブジェクトができることを定義します。

【最重要:selfとは?】
__init__attackの最初の引数に必ずいるself。これは**「オブジェクト自身」**を指す、特別な予約語です。self.name = nameというコードは、「**(このオブジェクト自身の).名前 = (引数で受け取った)名前**」という意味になります。これがあるおかげで、各オブジェクトは自分の名前やHPを正しく管理できるのです。


クラスからオブジェクトを生成し、使ってみよう

設計図(クラス)ができたので、いよいよ実物(オブジェクト)を作ってみましょう!

# Playerクラス(設計図)から、2人のプレイヤー(オブジェクト)を生成
player1 = Player("Tech Samurai", 100, 15)
player2 = Player("Ninja Python", 120, 12)

print("-" * 20)

# --- オブジェクトの属性にアクセス ---
# ドット(.)を使って、そのオブジェクトのデータにアクセスできる
print(f"{player1.name} のHPは {player1.hp} です。")
print(f"{player2.name} の攻撃力は {player2.attack_power} です。")

print("-" * 20)

# --- オブジェクトのメソッドを呼び出す ---
# ドット(.)を使って、そのオブジェクトの処理を呼び出す
player1.attack("スライム")
player2.attack("ゴブリン")

実行結果:

Tech Samurai がゲームの世界に召喚された!
Ninja Python がゲームの世界に召喚された!
--------------------
Tech Samurai のHPは 100 です。
Ninja Python の攻撃力は 12 です。
--------------------
Tech Samurai の攻撃!
スライム に 15 のダメージを与えた!
Ninja Python の攻撃!
ゴブリン に 12 のダメージを与えた!

player1player2は、同じ`Player`クラスから作られましたが、それぞれが異なる名前やHPを持っていることが分かりますね。これこそが、オブジェクト指向の力です。


まとめ

今回は、オブジェクト指向プログラミングの世界への第一歩として、最も基本的な概念を学びました。

  • クラスは、オブジェクトを作るための**「設計図」**である。
  • オブジェクト(インスタンス)は、クラスから作られた**「実物」**である。
  • クラスは、データである**「属性」**と、処理である**「メソッド」**を持つ。
  • __init__は、オブジェクトが作られるときに呼ばれる初期化メソッド。
  • selfは、オブジェクト自身を指す特別な言葉。

データと、それに関連する処理をひとまとめにするオブジェクト指向の考え方は、大規模で複雑なプログラムを、整理整頓された分かりやすい状態に保つための、人類の知恵なのです。

さて、基本的な設計図の作り方は分かりました。しかし、オブジェクト指向の真の力は、設計図同士の関係性の中にあります。次回は、ある設計図を元にして、さらに専門的な新しい設計図を作る**「継承」**というパワフルな概念を探検します。お楽しみに!

コメント

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