さて、クラスには「属性」(特徴)の他に、「メソッド」(動き)があるって話したよね。Pythonでは、このメソッドにもいくつか種類があるんだ。
今回は、主に使う3つのメソッド、「インスタンスメソッド」「クラスメソッド」「スタティックメソッド」について見ていこう!
「インスタンスメソッド」は、それぞれの「モノ(インスタンス)」が持つことができる動きのことだよ。
例えば、キャラクターが「攻撃する」とか「走る」といった動きは、それぞれのキャラクターが行うことだから、インスタンスメソッドになるんだ。
class Character:
def __init__(self, name):
self.name = name
# インスタンスメソッド:最初の引数は必ず「self」にするんだ
def attack(self):
print(self.name + "が攻撃した!")
yusha = Character("勇者")
yusha.attack() # 出力: 勇者が攻撃した!
self
というのは、そのメソッドを呼んでいる「インスタンス自身」を指すんだ。ちょっと不思議に思うかもしれないけど、これはPythonのお約束だから、そういうものだと覚えてね。
「クラスメソッド」は、インスタンスではなく、「設計図(クラス)」自体に関係する動きのことだよ。
例えば、「このゲームで、今までに何人のキャラクターが作られたか数える」といった機能は、個々のキャラクターではなく、キャラクターという種類全体に関わることだから、クラスメソッドで実装することが多いんだ。
class Character:
count = 0 # 作られたキャラクターの数
def __init__(self, name):
self.name = name
Character.count += 1 # キャラクターが作られるたびに数を増やす
# クラスメソッド:最初の引数は必ず「cls」にするんだ。@classmethodをつけるよ
@classmethod
def how_many_characters(cls):
print("今までに" + str(cls.count) + "人のキャラクターが作られました。")
yusha = Character("勇者")
mahoutsukai = Character("魔法使い")
Character.how_many_characters() # 出力: 今までに2人のキャラクターが作られました。
@classmethod
という特別な記号と、引数のcls
がポイントだよ。cls
はそのクラス自身を指しているんだ。
最後に「スタティックメソッド」は、クラスともインスタンスとも直接関係しない、ただの「便利な機能」をクラスの中に置いておきたいときに使うよ。
例えば、ゲームの「起動画面を表示する」といった機能は、特定のキャラクターには関係ないけど、ゲーム全体として必要な機能だよね。そんなときにスタティックメソッドが便利なんだ。
class Game:
# スタティックメソッド:最初の引数にselfもclsもいらないんだ。@staticmethodをつけるよ
@staticmethod
def show_start_screen():
print("====== ゲームスタート! ======")
print("ようこそ、ファンタジーの世界へ!")
print("===========================")
Game.show_start_screen()
# 出力:
# ====== ゲームスタート! ======
# ようこそ、ファンタジーの世界へ!
# ===========================
@staticmethod
という特別な記号をつけると、self
もcls
も引数にいらないんだ。単独で使える便利な機能として、クラスの中にまとめておきたいときに使うと良いよ。
インスタンスメソッド、クラスメソッド、スタティックメソッド。それぞれに役割があるから、うまく使いこなせるようになると、もっとすごいプログラムが作れるようになるはずだよ!