かゆい所に手が届く解説

Python中級者向け:クラスメソッド・インスタンスメソッド・静的メソッドの違いと使い分けの実例4選

クラスメソッド・インスタンスメソッド・静的メソッドの違い

Pythonでオブジェクト指向プログラミングを学び始めると、「インスタンスメソッド」「クラスメソッド」「静的メソッド」など、似たような言葉がたくさん出てきて混乱する人も多いと思います。

この記事では、それぞれの違いを初心者向けにやさしく解説し、使い分けのポイントや具体例も交えて紹介します。

それぞれの定義と例

インスタンスメソッド(通常のメソッド)

インスタンスごとに異なる情報(属性)を使いたいときに使います。

インスタンスメソッドは、作られたオブジェクト(=インスタンス)に対して使う関数です。

クラスの中で定義し、最初の引数には必ず self を使います。

こんなときに使う!

  • オブジェクトごとに異なる情報(属性)を使いたいとき
  • たとえば、犬ごとに名前や鳴き声が違うような場面
class Dog:
    def __init__(self, name):
        self.name = name

    def bark(self):  # ← selfがある = インスタンスメソッド
        print(f"{self.name}がワンと鳴いた")

dog = Dog("ポチ")
dog.bark()  # → ポチがワンと鳴いた

クラスメソッド(@classmethod)

全体で共有したい情報(クラス変数)にアクセスしたいときや、別の形でインスタンスを作る「ファクトリメソッド」に使います。

クラスメソッドは、クラスそのものに対して使う関数です。

インスタンスではなく、クラス全体に関わる処理に向いています。定義するときは @classmethod を使い、最初の引数は cls にします。

こんなときに使う!

  • クラス全体で共有している情報を使いたいとき
  • 別の形でインスタンスを作る「ファクトリメソッド」を作りたいとき
class Dog:
    count = 0

    def __init__(self, name):
        self.name = name
        Dog.count += 1

    @classmethod
    def how_many(cls):  # ← clsがある = クラスメソッド
        print(f"今までに作られた犬は {cls.count} 匹です")

Dog("ポチ")
Dog("シロ")
Dog.how_many()  # → 今までに作られた犬は 2 匹です

静的メソッド(@staticmethod)

selfcls も必要ない、汎用的な処理をクラスにまとめたいときに使います。

静的メソッドは、クラスにもインスタンスにも依存しない関数です。

ただ、クラスに関連する処理をまとめたいときに便利です。@staticmethod を使って定義し、selfcls は不要です。

こんなときに使う!

  • そのクラスと意味的には関係あるけど、データを使わない処理をまとめたいとき
  • ユーティリティ的な関数をクラス内に置きたいとき
class Dog:
    @staticmethod
    def greet():
        print("こんにちは!犬です。")

Dog.greet()

実は、この場合はわざわざ静的メソッドとして記述する必要もないです。

  • その処理がクラスの論理的まとまりの一部と明確に判断できるとき
  • 外部から Class.method() という呼び出し方で使うことに意味があるとき
  • 将来的に @classmethod やインスタンス化の可能性を見据えているとき

このようなときに、静的メソッドにします。

3種類のメソッドの違い【まとめ表】

ここまで、インスタンスメソッド・クラスメソッド・静的メソッドのそれぞれの特徴や使い方について学びました。

この3つのメソッドは、どれもクラス内で定義できる関数ですが、それぞれ「どの範囲に影響するのか」「何のために使うのか」が異なります。

以下の表では、それぞれのメソッドの違いを一目で比較できるようにまとめました。

インスタンスに紐づく処理なのか? クラス全体の状態に関わるのか? それともどちらにも依存しない汎用的な処理なのか?

といった視点で整理すると、設計や使い分けがしやすくなります。

Pythonのクラスには、目的や使い方に応じて3つのタイプのメソッドがあります。

それぞれの特徴を押さえることで、クラス設計がより明確になり、コードの保守性も向上します。

静的メソッドとクラス外の関数の違い

静的メソッドの内容を見ると、「クラスの外で普通に定義する関数と同じなのでは?」と思われるかもしれません。

それぞれの違いについて、クラスとの関係を踏まえて比較してみましょう。

違いのポイント:

  • 静的メソッドは、クラスに意味的なつながりがある処理をグループ化したいときに使う
  • クラス外の関数は、そのクラスに特に関係のない、完全に独立した処理

整理すると:

  • クラスに「関係あるけど、依存はしない処理」→ 静的メソッド
  • クラスに「まったく関係のない処理」→ クラス外の関数

どちらを使うかの判断基準

その関数がそのクラスと意味的に「一緒に存在すべき処理」 → 静的メソッド

  • 例:Dog.convert_age_to_human_years(dog_age)

そのクラスとは無関係な処理 → クラス外に書くのがよい

  • 例:print_banner() など他のモジュールでも再利用しやすいもの

私はインスタンス変数にもクラス変数にもメソッドにもアクセスしないメソッドなら、静的メソッドではなく単独の関数にした方が良いと考えています。

(上の例で、「こんにちは!犬です」と出力するだけなら関数でも良いです。)

ケーススタディ:4つの使い分け事例

それぞれのメソッドや関数が、どのような場面で使われるのか?具体的なケースを見てみましょう。

ケース①:インスタンスメソッド

場面:個別のユーザー情報を管理する処理

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

    def greet(self):
        print(f"こんにちは、{self.name}さん!")

u = User("山田")
u.greet()  # → こんにちは、山田さん!

➡ インスタンス(ユーザー)ごとに異なる名前を持っており、それに応じた処理を行いたい場合に使う。

ケース②:クラスメソッド

場面:インスタンスを条件に応じて生成するファクトリーメソッド

class Temperature:
    def __init__(self, celsius):
        self.celsius = celsius

    @classmethod
    def from_fahrenheit(cls, fahrenheit):
        celsius = (fahrenheit - 32) * 5 / 9
        return cls(celsius)

# 摂氏に変換してインスタンスを作る
temp = Temperature.from_fahrenheit(98.6)
print(temp.celsius)  # → 約37.0

➡ クラス全体に関係する「変換ロジック」を含み、条件に応じてインスタンスを生成したいときに使う。

ケース③:静的メソッド

場面:クラスに関連するが、インスタンスやクラス変数を使わない補助的な処理

class MathUtils:
    @staticmethod
    def is_even(number):
        return number % 2 == 0

print(MathUtils.is_even(4))  # → True

➡ クラスと意味的に関連する汎用的な処理を、グループ化したいときに使う。

ケース④:クラス外の関数

場面:複数のクラスや処理から共通で使うバナー表示関数

def print_banner():
    print("================")
    print("   Welcome!   ")
    print("================")

print_banner()

➡ クラスとは無関係で、どの場面でも使い回せる汎用的な処理はクラスの外に定義する。

まとめ

いかがだったでしょうか。

ここまでの話をまとめると、以下のようになります。

  • インスタンスメソッド:オブジェクトに依存する処理
  • クラスメソッド:クラス全体に関わる処理
  • 静的メソッド:クラスに関連はあるが、依存しない処理
  • クラス外の関数:汎用性があり、どのクラスにも属さない処理

それぞれ、「どの範囲に属する処理なのか(インスタンスか、クラスか、それとも独立しているか)」によって使い分けるということが大切です。

Pythonでは、同じ「関数定義」に見えても、役割や使い方が少しずつ異なります。

設計の意図や処理の性質に応じて適切な方法を選ぶことで、コードの可読性再利用性がぐっと高まります。

「この処理はインスタンスの状態に依存しているか?」「クラス全体で使うべきか?」「クラスと関係が深いけど、依存しないか?」

そんな視点を持ちながら使い分けてみてください。

慣れてくると、それぞれのメソッドの意味と便利さが、きっと自然に身についてくるはずです。

最後までご覧いただき、ありがとうございます。

できるだけ、初心者の方にも理解しやすいように解説したつもりですが、分かりづらい点があればコメントなどでお知らせください。

今後も初心者向けにプログラミングの情報をお届けします。

以下のメルマガにご登録頂くと、不定期に配信をお届けします。

ぜひ購読してください!

それでは、ステキなPythonライフを!

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です