Pythonにおけるオブジェクト

メソッド定義(インスタンスメソッド・クラスメソッド・スタティックメソッド)

さて、クラスには「属性」(特徴)の他に、「メソッド」(動き)があるって話したよね。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はそのクラス自身を指しているんだ。

Pythonにおけるオブジェクト

メソッド定義(インスタンスメソッド・クラスメソッド・スタティックメソッド)

スタティックメソッド

最後に「スタティックメソッド」は、クラスともインスタンスとも直接関係しない、ただの「便利な機能」をクラスの中に置いておきたいときに使うよ。

例えば、ゲームの「起動画面を表示する」といった機能は、特定のキャラクターには関係ないけど、ゲーム全体として必要な機能だよね。そんなときにスタティックメソッドが便利なんだ。


class Game:
    # スタティックメソッド:最初の引数にselfもclsもいらないんだ。@staticmethodをつけるよ
    @staticmethod
    def show_start_screen():
        print("====== ゲームスタート! ======")
        print("ようこそ、ファンタジーの世界へ!")
        print("===========================")

Game.show_start_screen()
# 出力:
# ====== ゲームスタート! ======
# ようこそ、ファンタジーの世界へ!
# ===========================

@staticmethodという特別な記号をつけると、selfclsも引数にいらないんだ。単独で使える便利な機能として、クラスの中にまとめておきたいときに使うと良いよ。

インスタンスメソッド、クラスメソッド、スタティックメソッド。それぞれに役割があるから、うまく使いこなせるようになると、もっとすごいプログラムが作れるようになるはずだよ!