🎮 クラスをやさしく解説!
クラスとは「設計図」です。
👉 ゲームキャラを作るための設計図だと思って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()
🏆 チャレンジ問題
クラスの中で「データ(プロパティ)」を持たせる正しい書き方はどれ?

