【レベル6】クラス

🎮 クラスをやさしく解説!

クラスとは「設計図」です。
👉 ゲームキャラを作るための設計図だと思ってOK!

🟢 ① クラスの基本(設計図)

class クラス名:
    pass

👉 pass は「何もしない」という命令
Pythonには「コロン( : )の次の行は、必ず字下げ(インデント)して何か書かなければならない」という文法ルールがあります。
「クラスの名前だけ先に決めて、中身は後で作る」という時に「今は何もしないけど、文法上ここには何かあることにしておく」という役割が pass です。

class Player:
    pass

👉 Playerというクラス名だけ決まっている、まだ中身は空の設計図

【名前の付け方・頭文字】
クラス名:大文字で始める
変数名:小文字で始める
関数名:小文字で始める

🟡 ② 生成(インスタンス)

p1 = Player()

👉 設計図からキャラを作る!
👉 変数名 = クラス名()
   p1 という変数に、Player という設計図から作った「実体(インスタンス)」を入れた
👉 p1 がキャラ本体

⚠️ よくあるミス
クラス名の後ろに () を忘れないように!

🔵 ③ コンストラクタ(__init__)

クラスが作られたときに最初に動く初期設定で、
自動的に実行される特別な関数

class Player:
    def __init__(self, 引数1, 引数2):
        self.引数1 = 引数1
        self.引数2 = 引数2

p1 = Player(引数1の値, 引数2の値)

👉 __init__  は初期化(initialize)の略
  ↑ ↑
initの前後にアンダーバー2つ

👉 self は最初の引数として絶対に必要!

class Player:
    def __init__(self, name, hp):
        self.name = name
        self.hp = hp

p1 = Player("たろう",100)

👉 def(関数)だけど、__init__ でクラスを作るときに自動で実行される
👉 self(自分)のname(名前)と hpをセット

⚠️ よくあるミス
・self は絶対に必要!
・__init__ の前後はアンダーバー2つ

🟣 ④ プロパティ(データ)

プロパティは「そのものが持っている特徴」のこと
クラス(設計図)で作った実体(インスタンス)が持っている「データ」のことを、
プロパティ(または属性)と呼びます。

プロパティの作り方は2種類

➀ コンストラクタを使う(初期設定で)

def __init__(self, name):
    self.name = name  # これがプロパティ!

➁ あとから追加・変更する
Pythonでは、あとから「.」を使ってプロパティを書き換えることもできます。

p1.name = "たろう"
p1.hp = 100

🟠 ⑤ メソッド(動き)

メソッドとはそのクラスの「動きや能力」のこと
クラス(設計図)の中に書かれた「関数」のことを、メソッドと呼びます。

class Player:
    def __init__(self, name):
        self.name = name

  # ↓これがメソッド!
    def greet(self):
        print(self.name + "です!")

p1 = Player("たろう")
p1.greet()

👉 クラスの中で作る関数(メソッド)は、最初の引数を必ず self にする!
出力:たろうです!

メソッドの主語について

👉 メソッドを使う時、クラスの外で使うか中で使うかによって主語の書き方が変わる
・クラスの中(設計図): self.attack() ← 主語は「self(自分)」
・クラスの外(使う人): p1.attack() ← 主語はインスタンス名

設計図を書いている時点では、将来そのキャラが p1 と呼ばれるか p2 と呼ばれるか分からないので、とりあえず「self(自分)」という主語を使う。

💡 ポイント
・クラスの中では、メソッドを作るときも使う時も self は絶対に必要!
・クラスの外で使う時は、「主語(インスタンス名).メソッド名()」

🔴 ⑥ 継承(引き継ぐ)

すでにある設計図をコピーして、新しい機能を追加した『パワーアップ版』の設計図を作ること

class 新しいクラス名(継承したいクラス名):
    def 追加したい技(self):

👉 元の設計図でできることは、わざわざ書かなくても使える
👉 元の設計図にない新しい技を追加できる

# 親クラス(基本の設計図)
class Player:
    def __init__(self, name):
        self.name = name
    
    def walk(self):
        print(self.name + "は歩いた。")

# 子クラス(Playerを継承した魔法使い)
class Wizard(Player):
    def magic(self):
        print(self.name + "は魔法を唱えた!")

# ここからインスタンス作成
p1 = Player("たろう")
wz = Wizard("魔女")

# ここからメソッドの呼び出し
p1.walk()
wz.magic()
wz.walk()

👉 Playerの機能をそのまま使える!
親(Player)が walk() という技を持っているので、子(Wizard)の設計図の中に書かなくても、いきなり wz.walk() が使える。

出力:たろうは歩いた。
   魔女は魔法を唱えた!
   魔女は歩いた。

⚠️ よくあるミス
class Wizard: と書くだけでは継承されていない!

🟤 ⑦ オーバーライド(上書き)

親と同じ名前の技だけど、中身だけ自分専用に変えたい!というとき、
子クラスで親クラスと全く同じ名前のメソッドを書き直すことを、
オーバーライド(Override:乗り越える、上書きする)といいます。

# 親クラス
class Player:
    def __init__(self, name):
        self.name = name
    
    def walk(self):
        print(self.name + "は普通に歩いた。")

# 子クラス(敵)
class Enemy(Player):
    # 【オーバーライド!】親と同じメソッド名で書き直す
    def walk(self):
        print(self.name + "は凄まじい速さで歩いた。")

# 子クラス(魔法使い)
class Wizard(Player):
    # 【オーバーライド!】魔法使いっぽく書き直す
    def walk(self):
        print(self.name + "はふわふわと浮いて移動した。")

# ここからメイン処理
p1 = Player("たろう")
e1 = Enemy("敵")
wz = Wizard("魔女")

p1.walk()
e1.walk()
wz.walk()

👉 親のメソッドを上書きできる!
👉 同じwalk()でもそれぞれ中身が違う!
出力:たろうは普通に歩いた。
   敵は凄まじい速さで歩いた。
   魔女はふわふわと浮いて移動した。

👉 なぜオーバーライドを使う?
・管理が楽: 「移動は walk()」と覚えておけば、相手が敵でも魔法使いでも、勝手にそのキャラに合った動きをしてくれる。
・整理整頓: 「歩く」という同じ目的の動作に、別々の名前をつけなくて済む。

⚠️ よくあるミス
メソッド名が違う → 上書きされない!

🎯 まとめ

  • クラス → 設計図
  • インスタンス → 実体を作る
  • __init__ → 初期設定
  • プロパティ → データ
  • メソッド → 動き
  • 継承 → 引き継ぐ
  • オーバーライド → 上書き

📝 練習問題

練習問題1

pは何?
上の「まとめ」にある用語から選んで答えよう。

class A:
    pass

p = A()

練習問題2

出力は?

class A:
    def __init__(self):
        self.x = 10

a = A()
print(a.x)

練習問題3

出力は?

class A:
    def hello(self):
        print("OK")

a = A()
a.hello()

練習問題4

出力は?

class A:
    def hello(self):
        print("A")

class B(A):
    pass

b = B()
b.hello()

練習問題5

出力は?

class A:
    def hello(self):
        print("A")

class B(A):
    def hello(self):
        print("B")

b = B()
b.hello()

🏆 チャレンジ問題

クラスの中で「データ(プロパティ)」を持たせる正しい書き方はどれ?

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