用語比較
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。
違いを表で確認
| 比較軸 | classmethod | staticmethod |
|---|---|---|
| 暗黙の第一引数 | 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冊です。読んだ章は、このサイトの章別問題で確かめられます。
どこで迷っているかを切り分ける
「cls」という引数名が出る人
classmethodです。第一引数にクラスが入ります。名前が cls であることは慣習で、クラスが渡される仕組みは @classmethod が作ります。
「self も cls も無い」メソッドが出る人
staticmethodです。暗黙の第一引数が無いので、呼ぶときに渡した引数だけが仮引数に入ります。
「継承したクラスから呼ぶと、どのクラスのインスタンスが返るか」を問われる人
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
デコレータを見る
@classmethod か @staticmethod かを確認します。付いていなければ、通常のインスタンスメソッドです。
- 2
第一引数を見る
cls ならclassmethod、無いか通常の引数ならstaticmethodです。self ならインスタンスメソッドです。
- 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を派生クラスから呼ぶと、派生クラスが渡されると言える
関連ページで確認する
同じ資格で次に知りたいこと
- zip() と enumerate() の違い(2つのリストを同時に回すか、番号つきで回すか)
Pythonの zip() と enumerate() の違いを、for文での取り出し方、長さが違うときの動き、strict=True と start 引数まで、Python3基礎試験の判断手順と確認問題つきで解説します。
- setとfrozensetの違い|あとから変更できるか、辞書のキーにできるか(Python3基礎)
setとfrozensetの違いを、Python公式ドキュメントの記述(setは変更可能でハッシュ値を持たない、frozensetは変更不可でハッシュ可能)とPython 3.9.6の実行結果で整理。辞書のキーにできるか、addが使えるかを切り分ける判断手順と確認問題つき。
- 浅いコピーと深いコピーの違い(copy.copy と copy.deepcopy)
Pythonの copy.copy(浅いコピー)と copy.deepcopy(深いコピー)の違いを、入れ子のリストを変更したときの動き、list.copy() や a[:] との関係、判断手順と確認問題つきで解説します。
よくある質問
Qstaticmethodとclassmethodの違いは?
classmethodはクラスを暗黙の第一引数(慣習的に cls)として受け取ります。staticmethodは暗黙の第一引数を受け取りません。どちらもクラスからもインスタンスからも呼べます。
Qclassmethodは何に使いますか?
公式ドキュメントは、代わりのコンストラクタを作るのに便利な型だと述べます。例として、別の形の引数からインスタンスを作って返すメソッドがあります。
Qstaticmethodはインスタンスから呼べますか?
呼べます。公式ドキュメントは、staticmethodはクラス(C.f())からもインスタンス(C().f())からも呼べると述べます。
次に見る比較
- G検定・DS検定・統計検定2級で重なる用語10語の比較
同じ名前の用語の定義と収録章を、資格ごとに並べます。
- ベイズの定理と条件付き確率の違い(統計検定2級の式と計算例)
求める確率の向きの違いと、陽性になる確率の計算例を確かめます。
- 紛らわしい用語ペア早見表
混同しやすい用語の違いと判定の手掛かりを、資格別の一覧で確かめます。
執筆: ミナト編集部(運営者情報を見る)
