Pythonのクラスでよく出てくる @classmethod と @staticmethod。
それぞれがどういうものかをうまく整理できていなかったので、この記事では基本的な使い方を自分なりにまとめてみました。
はじめに:@は何をしているの?
この記事では @classmethod や @staticmethod という記法が登場します。
この @ で始まる書き方は 「デコレータ(decorator)」 と呼ばれる仕組みです。
Pythonでは、@デコレータ名 と書くことで、関数やメソッドに特別な意味や機能を追加することができます。
たとえば、
@classmethod
def show(cls):
...
というのは、「この関数はクラスメソッドですよ」とPythonに伝えている、というイメージです。
※今回はデコレータの仕組みそのものについては深くは触れません。」
「@を使って、その関数に意味を付けているんだな」くらいの理解で読んでいただけると幸いです。
インスタンスメソッドとは?
まず基本となるのが「インスタンスメソッド」です。
class Person:
def say_hello(self):
print("こんにちは!")
p = Person()
p.say_hello() # → こんにちは!
-
selfは「今このメソッドを呼び出しているインスタンス自身」を意味します。 -
p.say_hello()のとき、Pythonはselfに自動的にpを渡しています。
classmethod(クラスメソッド)
class MyClass:
@classmethod
def show_class(cls):
print("これはクラスメソッドです")
MyClass.show_class() # → これはクラスメソッドです
-
@classmethodを付けると、最初の引数がclsになります(これは「class」の略です)。 -
clsは「今呼び出されたクラス自身」を指します。 - インスタンスを作らなくてもクラスから直接呼び出せます。
クラスメソッドの活用例(ファクトリメソッド)
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def from_birth_year(cls, name, birth_year):
age = 2025 - birth_year
return cls(name, age)
p = Person.from_birth_year("さくら", 2000)
print(p.name, p.age) # → さくら 25
- 通常は
ageを直接指定してインスタンスを作りますが、 -
birth_yearしかデータとして持っていない場合もあるので、そういったケースに対応する別の作り方を用意しています。 - こういった「通常とは異なる作り方(別の入力)でインスタンスを生成するメソッド」のことを ファクトリメソッド(factory method) と呼びます。
staticmethod(スタティックメソッド)
class MyMath:
@staticmethod
def add(a, b):
return a + b
print(MyMath.add(3, 4)) # → 7
-
@staticmethodを付けると、selfやclsを受け取らなくなります。 - クラスやインスタンスの情報に関係ない処理を、クラスの中にまとめておきたいときに使います。
- いわゆる「便利関数」をまとめておくイメージです。
まとめ(使い分け)
| 種類 | 第一引数 | 使いどころ | 特徴 |
|---|---|---|---|
| インスタンスメソッド | self |
インスタンスの情報を使いたいとき | インスタンスから呼ぶ |
| クラスメソッド | cls |
クラス自身を使いたいとき(別の生成方法など) | クラスからも呼べる |
| スタティックメソッド | なし | クラスにもインスタンスにも関係ない処理 | クラスにまとめたい便利関数など |
今回は、初心者でも理解しやすい例を使いながら、@classmethod と @staticmethod の基本的な違いや使い方を整理してみました。
少しでも理解の助けになればうれしいです。