AI資格ドリル
資格を選ぶ↓

用語比較

staticmethodとclassmethodの違い|第一引数にクラスを受け取るか(Python3基礎)

staticmethodとclassmethodは、どちらもクラスの中に書くメソッドで、インスタンスを作らずにクラスから呼べます。違いは、最初の引数にクラスを受け取るかどうかです。

classmethodは最初の引数にクラス(cls)を暗黙で受け取り、staticmethodは暗黙の第一引数を受け取らないと覚えると、クラスのメソッドの選択肢を切り分けられます。

このページは、Python公式ドキュメントの組み込み関数の項(classmethod・staticmethod)の記述をもとに、Python 3.9.6で実行した結果と合わせて比べます。

この記事の根拠と出典

各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。Python3エンジニア認定基礎試験の一次情報確認日: 2026-09-18。

結論

classmethod

@classmethod を付けたメソッドは、クラスを暗黙の第一引数として受け取る(慣習的な名前は cls)。クラスからもインスタンスからも呼べる。

staticmethod

@staticmethod を付けたメソッドは、暗黙の第一引数を受け取らない。クラスからもインスタンスからも呼べる。

見分け方

メソッドの中でクラスを使う(cls(...) で自分のクラスのインスタンスを作るなど)ならclassmethod、クラスもインスタンスも使わず、引数だけで決まる処理ならstaticmethod。

違いを表で確認

比較軸classmethodstaticmethod
暗黙の第一引数staticmethod:なし。def f(arg1, arg2) のように、渡した引数だけを受け取るclassmethod:クラス。def f(cls, arg1, arg2) の cls にクラスが入る
呼び出し方staticmethod:C.f() でも C().f() でも呼べるclassmethod:C.f() でも C().f() でも呼べる。インスタンスから呼んでも、使われるのはそのクラスだけ
継承したクラスから呼んだときstaticmethod:クラスの情報は渡されないclassmethod:派生クラスから呼ぶと、派生クラスが第一引数として渡される
典型的な使いどころstaticmethod:クラスやインスタンスの状態を使わない、引数だけで決まる処理をクラスの中にまとめるclassmethod:別の作り方でインスタンスを返す、代わりのコンストラクタ(公式ドキュメントが挙げる用途)

Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)

試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。

PR

ほかの資格を含む参考書・問題集の一覧を見る

どこで迷っているかを切り分ける

01

「cls」という引数名が出る人

classmethodです。第一引数にクラスが入ります。名前が cls であることは慣習で、クラスが渡される仕組みは @classmethod が作ります。

02

「self も cls も無い」メソッドが出る人

staticmethodです。暗黙の第一引数が無いので、呼ぶときに渡した引数だけが仮引数に入ります。

03

「継承したクラスから呼ぶと、どのクラスのインスタンスが返るか」を問われる人

classmethodの中で cls(...) を使っているなら、呼んだクラス(派生クラス)のインスタンスが返ります。クラス名を直接書いているなら、そのクラスのインスタンスです。

具体例で使い分ける

例 1

派生クラスから代わりのコンストラクタを呼ぶ場合(架空のコード)

class Dog に @classmethod def make(cls, name): return cls(name) があり、class Puppy(Dog): pass と定義して、Puppy.make('a') を呼びます。type(...).__name__ は何になるでしょうか。

  • classmethodは、派生クラスから呼ばれたとき、派生クラスを第一引数として受け取ります。
  • つまり cls は Dog ではなく Puppy で、cls(name) は Puppy のインスタンスを作ります。Python 3.9.6で実行すると 'Puppy' が出ます。

結論: classmethodの cls は、呼んだクラスです。答えは 'Puppy' です。

例 2

インスタンスから呼んだ場合(架空のコード)

同じ Dog で Dog('c').make('d') を呼んだとき、第一引数 cls には何が入るでしょうか。

  • 公式ドキュメントは、classmethodはインスタンスから呼べるが、インスタンスはそのクラス以外は無視されると述べます。
  • cls に入るのは、インスタンス(Dog('c'))ではなく、そのクラス Dog です。Python 3.9.6で type(...) の名前を確かめると 'Dog' になります。

結論: インスタンスから呼んでも、cls に入るのはクラスです。

例 3

staticmethodをクラスとインスタンスから呼ぶ場合(架空のコード)

@staticmethod def bark_count(n): return n * 2 を持つ Dog で、Dog.bark_count(3) と Dog('x').bark_count(3) を呼びます。

  • staticmethodは暗黙の第一引数を受け取らないので、3 がそのまま n に入ります。
  • インスタンスから呼んでも self は渡されず、Python 3.9.6では、どちらも 6 になります。

結論: staticmethodは、クラスから呼んでもインスタンスから呼んでも、結果は同じです。

問題文から答えを選ぶ手順

  1. 1

    デコレータを見る

    @classmethod か @staticmethod かを確認します。付いていなければ、通常のインスタンスメソッドです。

  2. 2

    第一引数を見る

    cls ならclassmethod、無いか通常の引数ならstaticmethodです。self ならインスタンスメソッドです。

  3. 3

    呼んだクラスを見る

    派生クラスから呼ぶ設問では、classmethodの cls に入るのは派生クラスです。

試験での見分け方

  • 1classmethodは、クラスを暗黙の第一引数として受け取る。インスタンスから呼んでも、クラスが渡される。
  • 2staticmethodは、暗黙の第一引数を受け取らない。
  • 3classmethodを派生クラスから呼ぶと、派生クラスが第一引数として渡される。

誤答しやすい選択肢

classmethodの第一引数にインスタンスが入ると考える

修正: 入るのはクラスです。インスタンスから呼んでも、インスタンスは無視され、クラスだけが使われます。

staticmethodの第一引数に self が自動で入ると考える

修正: 公式ドキュメントは、staticmethodは暗黙の第一引数を受け取らないと述べます。self が入るのは通常のインスタンスメソッドです。

Python の classmethod・staticmethod が Java や C++ の static メソッドと同じだと考える

修正: 公式ドキュメントは、classmethodはC++やJavaのstaticメソッドとは異なると述べ、それらに近いのは staticmethod だと説明します。

確認問題

Q1クラスを暗黙の第一引数として受け取るメソッドを作るデコレータは?

答え: @classmethod

公式ドキュメントは、クラスメソッドは、インスタンスメソッドがインスタンスを受け取るのと同じように、クラスを暗黙の第一引数として受け取ると述べます。

Q2暗黙の第一引数を受け取らないメソッドを作るデコレータは?

答え: @staticmethod

公式ドキュメントは、静的メソッドは暗黙の第一引数を受け取らないと述べます。

Q3classmethodを派生クラスから呼んだとき、第一引数に渡されるのは?

答え: 派生クラス

公式ドキュメントは、派生クラスから呼ぶと、派生クラスのオブジェクトが暗黙の第一引数として渡されると述べます。

到達チェック

  • classmethodは暗黙の第一引数としてクラスを受け取ると言える
  • staticmethodは暗黙の第一引数を受け取らないと言える
  • classmethodを派生クラスから呼ぶと、派生クラスが渡されると言える

同じ資格で次に知りたいこと

よくある質問

Qstaticmethodとclassmethodの違いは?

A

classmethodはクラスを暗黙の第一引数(慣習的に cls)として受け取ります。staticmethodは暗黙の第一引数を受け取りません。どちらもクラスからもインスタンスからも呼べます。

Qclassmethodは何に使いますか?

A

公式ドキュメントは、代わりのコンストラクタを作るのに便利な型だと述べます。例として、別の形の引数からインスタンスを作って返すメソッドがあります。

Qstaticmethodはインスタンスから呼べますか?

A

呼べます。公式ドキュメントは、staticmethodはクラス(C.f())からもインスタンス(C().f())からも呼べると述べます。

次に見る比較

執筆: ミナト編集部(運営者情報を見る)