Pythonのデコレータ(@staticmethod / @classmethod)の使い方を徹底解説!初心者でもわかるOOP入門
生徒
「Pythonのクラスの中で、@staticmethodとか@classmethodって書いてあるのを見たんですが、正直よくわかりません…」
先生
「それはPythonのデコレータと呼ばれる仕組みで、クラスの中の関数の役割をわかりやすくするためのものです。」
生徒
「クラスの中の関数って、全部同じじゃないんですか?」
先生
「実は、役割によって使い分けると、プログラムがとても読みやすく、安全になります。順番に見ていきましょう。」
1. Pythonのデコレータとは?
Pythonのデコレータとは、「関数やメソッドの動きを、あとから分かりやすく指定するための目印」のようなものです。
見た目は@から始まり、関数やメソッドのすぐ上に書きます。
プログラミング未経験の方は、「ラベル」や「付せん」をイメージすると理解しやすいです。 箱(関数)に「これは特別な使い方ですよ」と書いたシールを貼る感覚です。
Pythonのオブジェクト指向プログラミング(OOP)では、特に @staticmethod と @classmethod という2つのデコレータがよく使われます。
2. クラスとメソッドの超基本
クラスとは、現実世界の「設計図」のようなものです。 たとえば「人」というクラスを作ると、名前や年齢といった情報や、話す・歩くといった動作をまとめられます。
クラスの中に書く関数のことをメソッドと呼びます。 普通のメソッドは、作られた実体(これをインスタンスと言います)と強く結びついています。
しかし、すべての処理が「個人専用」である必要はありません。
そこで登場するのが、@staticmethodと@classmethodです。
3. @staticmethodとは?
@staticmethodは、「このメソッドは、クラスに関係しているけれど、個別の情報は使いません」 という意味を持つデコレータです。
例えるなら、「会社の中で使う計算機」のような存在です。 誰のものでもなく、名前や部署に関係なく使える道具です。
class Calculator:
@staticmethod
def add(a, b):
return a + b
result = Calculator.add(3, 5)
print(result)
8
この例では、addメソッドはクラスの中にありますが、
特定のデータを持つ必要がありません。
そのためselfも使っていません。
@staticmethodを使うことで、「この処理は補助的な機能です」と
プログラムを読む人に伝えられます。
4. @classmethodとは?
@classmethodは、「クラスそのものに関係する処理」を書くためのデコレータです。
メソッドの最初の引数には、selfではなくclsが渡されます。
clsとは、「このクラス自体」を表す特別な名前です。
設計図そのものを見ながら処理をするイメージです。
class User:
user_count = 0
@classmethod
def create_user(cls):
cls.user_count += 1
return cls.user_count
print(User.create_user())
print(User.create_user())
1
2
この例では、Userクラス全体で共有される
user_countという数値を操作しています。
@classmethodを使うことで、
「クラス全体の状態を管理する処理」であることが明確になります。
5. 通常のメソッドとの違い
Pythonのクラスには、主に次の3種類のメソッドがあります。
- 通常のメソッド:個別のデータを扱う
- @staticmethod:独立した便利機能
- @classmethod:クラス全体を操作する処理
これを日常生活に例えると、 通常のメソッドは「個人のスマートフォン」、 staticmethodは「共有のコピー機」、 classmethodは「会社のルール変更」のようなものです。
6. なぜ使い分けるのか?
デコレータを使い分ける最大の理由は、 プログラムが読みやすくなり、間違いを防げることです。
何でも通常のメソッドにしてしまうと、 「これは個人用なのか、全体用なのか」が分かりにくくなります。
@staticmethodや@classmethodを正しく使うことで、
Pythonのオブジェクト指向プログラミングらしい、
きれいで安全なコードを書くことができます。