スポンサーリンク

【Python入門】staticメソッドとclassメソッドの違いとは?初心者向けにやさしく解説!

クラス設計・OOP入門

はじめに|Pythonのメソッド、ちゃんと使い分けできてる?

Pythonでクラスを使い始めると、「staticメソッド」や「classメソッド」という言葉に出会いますよね。

最初のうちは「なんとなく似てる」「どっちもクラスの中に書くっぽい」くらいの理解で進んでしまう人も多いんですが、実はこの2つのメソッドにはしっかりとした役割の違いがあります。

たとえば、こんな疑問を持ったことはありませんか?

  • @staticmethod@classmethodって何が違うの?」
  • 「インスタンスを使わないのに、なんでクラスにメソッドを定義するの?」
  • 「自作クラスで@classmethodを使う意味ってあるの?」

このあたりのポイントをおさえておくと、クラス設計がグッとわかりやすくなりますし、Pythonらしいコードの書き方も身についてきます。

この記事では、まず「普通のメソッドとは何か?」からスタートして、@staticmethod@classmethodの違いや使い分け方を実例つきで丁寧に解説していきます。

Pythonのクラスをもっと自在に使いこなしたい方、ぜひ最後までチェックしてみてください!




1. 通常のメソッドとは?

まずは基本から確認しておきましょう。Pythonの「メソッド」とは、クラスの中で定義された関数のことです。これは、インスタンス(オブジェクト)と一緒に使われることを前提としています。

たとえば、以下のようなクラスを見てください:

class Book:
def __init__(self, title, price):
self.title = title
self.price = price

def display_info(self):
print(f"{self.title}:{self.price}円")

この中で定義されている __init__()display_info() が、いわゆる「通常のメソッド」です。

selfってなに?

通常のメソッドの第一引数には、**self**という名前が慣習的に使われます。これは、「そのメソッドが呼び出されたインスタンス自身」を指します。

つまり self.titleself.price と書くことで、そのオブジェクトが持っている情報にアクセスできます。

book1 = Book("Python入門", 1980)
book1.display_info() # → Python入門:1980円

上のように、Book クラスのオブジェクト book1 を作成したうえで、display_info() メソッドを呼び出すと、自動的に selfbook1 が渡されます。

ポイントまとめ

  • 通常のメソッドは、オブジェクトと一緒に使うのが前提。
  • self は、そのオブジェクト自身を指していて、属性や他のメソッドにアクセスするために使います。
  • 呼び出しは「オブジェクト.メソッド名()」の形が基本。

この「self付きのメソッド」がPythonのメソッドの基本形となります。




2. staticメソッドとは?

ここからは、普通のメソッドとはちょっと違う「staticメソッド」について見ていきましょう。

staticメソッドってなに?

staticメソッドは、クラスに属する関数ですが、通常のメソッドのようにインスタンス(オブジェクト)に依存しない処理を定義したいときに使います。

通常のメソッドとは違い、staticメソッドでは第一引数に self を受け取りません。

定義には、@staticmethod というデコレータを使います。

class Book:
def __init__(self, title, price):
self.title = title
self.price = price

@staticmethod
def is_expensive(price):
return price > 3000

この is_expensive() メソッドは、Book オブジェクトの状態とは関係なく、単に与えられた価格が高いかどうかを判定しているだけです。

staticメソッドの使い方

staticメソッドは、クラス名から直接呼び出せます。インスタンスを作る必要はありません。

print(Book.is_expensive(3500))  # → True

もちろん、インスタンスから呼び出すこともできますが、それはあまり推奨されません(後述します)。

book1 = Book("Python逆引き辞典", 3500)
print(book1.is_expensive(book1.price)) # → True(呼び出し自体はOK)

staticメソッドを使う場面

staticメソッドは、こんなときに便利です:

  • クラスに関係する「補助的な処理」をクラスの中にまとめたいとき
  • インスタンスのデータにアクセスしない、単独で動く処理をクラスに所属させたいとき

たとえば、本の価格でリストをソートする処理などは、Bookクラスのstaticメソッドとして書くとスッキリします。

@staticmethod
def sort_books_by_price(books):
return sorted(books, key=lambda book: book.price)

なぜクラスの外に書かないの?

このような処理は、正直言って普通の関数としてクラスの外に定義しても動きます

でも、staticメソッドにすると:

  • クラスと関係があることが明確になる
  • クラス内に整理されて、コードの構造が分かりやすくなる

というメリットがあります。




3. classメソッドとは?

今度は、@classmethod を使って定義する「classメソッド」について解説します。staticメソッドと見た目は似ていますが、実は役割も使い道もまったく違うんです。

classメソッドの特徴とは?

classメソッドも、staticメソッドと同じくインスタンスを作らずに呼び出すことができるメソッドです。ただし、staticメソッドと違って第一引数にクラス自身が自動で渡されるという特徴があります。

この第一引数には、慣習的に cls という名前が使われます。これは「このメソッドが属しているクラスそのもの」を表します。

class Book:
def __init__(self, title, price):
self.title = title
self.price = price

@classmethod
def from_string(cls, book_str):
title, price = book_str.split(",")
return cls(title, int(price))

この from_string() は、文字列をもとに Book オブジェクトを生成するファクトリーメソッドの一例です。

呼び出し方はクラス名から

classメソッドも、クラス名から直接呼び出すのが基本です。

book_data = "Python実践入門,2800"
book2 = Book.from_string(book_data)
print(book2.title) # → Python実践入門

もちろん、インスタンスから呼び出すこともできますが、やはりクラス名から呼ぶ方が意図が伝わりやすく、ベストプラクティスです。


classメソッドが活躍する場面

✅ ファクトリーメソッドとしての活用

クラスメソッドはよく「ファクトリーメソッド(オブジェクトを生成するためのメソッド)」として使われます。特に、外部データ(例:文字列・JSON・辞書など)からインスタンスを生成するときに便利です。

@classmethod
def from_dict(cls, data):
return cls(data["title"], data["price"])

✅ 継承にも強い!

classメソッドは、派生クラスから呼び出されたときに、その派生クラスでオブジェクトを生成してくれるという利点があります。これがstaticメソッドとの大きな違いです。

class Ebook(Book):
def __init__(self, title, price, filesize):
super().__init__(title, price)
self.filesize = filesize

# Ebook.from_string() を使っても Ebookインスタンスが作られる!

これにより、継承に対応した柔軟なオブジェクト生成が可能になります。


classメソッドの代表的な例:datetime.date.today()

Pythonの標準ライブラリにもclassメソッドはよく使われています。有名なのは datetime モジュールの中にある date.today() です。

from datetime import date
print(date.today()) # 今日の日付が出力される

これは、date クラスからその日のインスタンスを作るclassメソッドです。こういった使い方が、classメソッドの王道パターンです。




4. staticメソッドとclassメソッドの違いをまとめて比較!

ここまでで、@staticmethod@classmethod のそれぞれの特徴や使い方を見てきました。似たように見えるこの2つ、実は使い道や役割に大きな違いがあります。

ここでは、両者の違いをわかりやすく整理してみましょう。

🔍 staticメソッドとclassメソッドの比較表

比較項目staticメソッドclassメソッド
デコレータ@staticmethod@classmethod
第一引数なしcls(クラス自体)
インスタンス不要〇(クラス名から呼び出せる)〇(クラス名から呼び出せる)
役割補助的な関数(ユーティリティ処理)クラスの状態を使ったオブジェクト生成など
インスタンス生成通常は行わないよく行う(ファクトリーメソッド)
継承の対応力弱い(クラス名が固定されがち)強い(呼び出し元のクラスに対応)
呼び出し元クラス名 or インスタンスクラス名 or インスタンス

💡こんなふうに使い分けよう!

  • クラスの内部処理を整理したいだけなら @staticmethod
    • 例:計算処理、並び替え、文字列フォーマットなど
  • オブジェクトを生成したり、継承を考慮した処理なら @classmethod
    • 例:辞書やJSONからの初期化、現在日時からのインスタンス生成など

staticメソッドとclassメソッドは、Pythonクラスを一段レベルアップして使いこなすための強力な道具です。うまく使い分けて、読みやすく拡張性のあるコードを書いていきましょう!




5. よくある間違いと設計上の注意点

staticメソッドやclassメソッドは便利な機能ですが、使い方を間違えるとコードが読みにくくなったり、思わぬバグの原因になることもあります。ここでは、初心者がつまずきやすいポイントと、設計時の注意点をまとめておきます。


❌ staticメソッドでオブジェクトを生成しようとする

staticメソッドは、クラスやインスタンスの情報を受け取れないため、クラスの状態を使った処理には向いていません

@staticmethod
def create_book(title, price):
return Book(title, price) # ここでBookを固定しているのがNGポイント

このように書くと、継承先のクラスでこのメソッドを使っても、常に Book のインスタンスしか作れません。

✅ オブジェクトを生成したいなら、classメソッドでclsを使うのが正解!

@classmethod
def create_book(cls, title, price):
return cls(title, price) # 呼び出したクラスに合わせたオブジェクトが生成される

❌ classメソッドに無理やり処理を詰め込みすぎる

classメソッドは柔軟で便利ですが、何でもかんでも詰め込むと処理の役割がぼやけてしまいます

たとえば、データの検証やファイル読み込み、データ変換、バリデーションなどを全部ひとつのclassメソッドで済ませようとすると、保守しづらいコードになりがちです。

✅ 複雑な処理は分割して、シンプルで読みやすいメソッドを意識しましょう。


❌ インスタンスから呼び出してしまう

staticメソッドやclassメソッドは、クラス名から呼び出すのが基本です。インスタンスから呼び出すと、動作はするけれど、コードの意図が伝わりにくくなってしまいます。

book = Book("Python超入門", 2500)
book.is_expensive(3000) # 動くけどわかりにくい

✅ クラスの設計を読みやすく保つためにも、クラス名からの呼び出しを心がけましょう。

Book.is_expensive(3000)  # こっちの方が意図が明確

❗拡張性を考えたclassメソッド設計を

classメソッドは継承時に便利な反面、基底クラスとサブクラスで初期化に必要な引数が異なると、エラーの原因になりやすいです。

class Book:
def __init__(self, title, price):
self.title = title
self.price = price

class Ebook(Book):
def __init__(self, title, price, filesize):
super().__init__(title, price)
self.filesize = filesize

# Bookのfrom_dictをEbookで使うとエラーになる可能性も…

✅ クラスごとに適切なファクトリーメソッドを定義するか、引数の整合性に注意するようにしましょう。




6. まとめ|staticとclassメソッドをうまく使いこなそう!

今回は、Pythonにおける @staticmethod@classmethod の違いと使い方を、実例を交えながら解説してきました。

どちらもクラスの外から呼び出せて便利なメソッドですが、それぞれにしっかりとした役割と使いどころがあります。

🎯この記事のポイントをおさらい!

  • 通常のメソッドself を使い、オブジェクトの状態にアクセスできる
  • staticメソッドselfcls を使わず、補助的な処理に向いている
  • classメソッドcls を使って、クラス自身の情報にアクセスしながら処理ができる
  • classメソッドは継承にも強く、ファクトリーメソッドに最適
  • どちらのメソッドも、使いどころを意識すればクラス設計がもっとわかりやすくなる!

Pythonでのクラス設計は、シンプルな構文の中にもたくさんの工夫が詰まっています。staticメソッドやclassメソッドを使いこなせるようになると、コードの再利用性や可読性がぐっと上がるので、ぜひ日々のコーディングで意識してみてくださいね。


あわせて読みたい

Pythonのクラス設計やデコレーター、OOPに関する知識をさらに深めたい方には、以下の記事もおすすめです!

👉 あわせて読めば、クラス設計の考え方がより一層クリアになりますよ!


よくある質問(Q&A)

Q
staticメソッドって、外に関数を定義するのと何が違うの?
A

クラスに関係のある処理だと明示できる点が大きな違いです。外に定義しても動作上は問題ありませんが、クラス内に書いた方が構造がスッキリします。

Q
classメソッドと通常のメソッドって何が違うの?
A

classメソッドはインスタンスではなく、クラス自体(cls)を対象に処理を行います。オブジェクトを生成する工場(ファクトリー)として使われることが多いです。

Q
staticメソッドとclassメソッド、どちらを使えばいいかわかりません
A

処理がオブジェクトやクラスの状態に関係ないなら @staticmethod、クラスからオブジェクトを作成するような場合は @classmethod を使いましょう。

※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。

※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。

スポンサーリンク