Python初心者のための便利なデコレータ解説 #2】 インスタンスなしで関数を呼べる！？ @staticmethod の使いどころを解説！

---
## はじめに
このシリーズでは、Python 初心者にもわかりやすく「便利なデコレータ」の使い方を毎回1つずつ紹介していきます。

💡「そもそもデコレータって何？」という方は、まず以下の記事をご覧ください：
> 👉 [【Python初心者のための便利なデコレータ解説 #0】そもそもデコレータってなに？仕組みと使い方をやさしく解説！](https://qiita.com/ys-B/items/d53f2a91c75b8e5981a2)

---

今回は、クラスの中で使えるデコレータのひとつ **`@staticmethod`** を紹介します。

このデコレータを使うと、**クラスに関係する処理を、インスタンスを作らずに呼び出すことができる**ようになります。

この記事では、`@staticmethod` の使い方やメリットを、具体例を交えながらわかりやすく解説していきます。

---

## `@staticmethod` とは？

`@staticmethod` は、**そのクラスに論理的には関係しているけれど、インスタンスの状態を使わない処理**を定義したいときに使います。

例えば、次のようなクラスがあるとします：

```python
class Button:
    def __init__(self, label):
        self.label = label

    def default_style():
        return "background-color: blue; color: white;"
```

この Button クラスは、画面に表示するボタンを表すクラスです。
ボタンのラベル（表示される文字列）を label として保持しています。

この中の `default_style` メソッドは、「ボタンに適用されるデフォルトのスタイル」を文字列で返すだけの関数です。

## この`default_style`メソッドって(・・?
よく見てみると、この関数では `self`（インスタンスの状態） を一切使っていません。  
つまり、「どのボタンインスタンスから呼び出しても、まったく同じ結果になる」ということです。

```python
class Button:
    def __init__(self, label):
        self.label = label

    def default_style(self):
        return "background-color: blue; color: white;"


btn1 = Button("OK")
btn2 = Button("Cancel")


print(btn1.default_style())  # => "background-color: blue; color: white;"
print(btn2.default_style())  # => "background-color: blue; color: white;"
```

言い換えると、**「状態を使わないが、そのクラスに意味的に関係がある処理」** です。

## ✅ `@staticmethod` に書き換えてみよう

`default_style` メソッドのような「状態（self）を使わないけど、クラスに意味的に属する」関数は、**`@staticmethod` をつけることで意図を明確にできます。**


 `default_style` メソッドに `@staticmethod` をつけてみましょう：

```python
class Button:
    def __init__(self, label):
        self.label = label

    @staticmethod
    def default_style():
        return "background-color: blue; color: white;"
```

`@staticmethod` をつけると、  「この関数はボタンの中で使うけど、ボタンの中身（状態）は使わないよ！」ということを Python に伝えられます。

そうすると、**ボタンを作らなくても `Button.default_style()` のように呼び出せる**ようになります。

## 💡インスタンスを作らずに使える関数って便利！
毎回同じ値を返す関数があります。
わざわざ毎回インスタンスを作るのはちょっと面倒ですよね。

```python
print(Button.default_style())  # ✅ ボタンを作らなくても使える！
```
`@staticmethod`をつけることで「クラスに関係するけど、インスタンスに依存しない処理」 をクラスに所属させつつ、関数だけを気軽に使えるようにします。

--- 
 ### なぜ `@staticmethod` にするのか？
- どのクラスに関係する処理かが明確（`Button.default_style()` なら「ボタン用の設定」だとすぐわかる）
- インスタンスの状態を使っていないことがはっきりする
- テストや再利用が簡単（インスタンス不要）

「状態を持たない関数だけど、クラスに意味を持たせたい」ときに、`@staticmethod` を使うとコードの構造がきれいになります。

---

## 実例：こんなときに使えるよ！
ここでは `@staticmethod` が活躍する、ケースを紹介します！
🔹 ロガーの出力フォーマットを再利用したいとき
```python
class Logger:
    @staticmethod
    def default_format():
        return "[INFO] {timestamp} - {message}"

print(Logger.default_format().format(
    timestamp="2025-06-15 10:00:00",
    message="OK!"
))
```

ログの実際の出力処理をまだ書いていなくても、このフォーマットだけ先に使いたい・確認したいということはよくあります。

たとえば：
- 他の関数から出力形式だけを使って表示プレビューしたい
- ドキュメントや設定ファイルに「このクラスの標準書式」を記載したい
- フォーマットをベースにカスタムロガーを作りたい

そんなとき、わざわざ Logger のインスタンスを作る必要はありません。
でも、「このフォーマットは Logger に関係している」という意味は残しておきたい。

⭕️ **そんな場合に `@staticmethod` がぴったりなんです！！！**

## まとめ
今回は `@staticmethod` について、以下のポイントを中心に紹介しました。

✅ インスタンスを使わない処理でも、クラスに関係するなら`@staticmethod`で整理できる
✅ インスタンス不要で呼び出せるから、再利用にも便利
✅ クラスの文脈を保ったまま、コードの構造をスッキリ整理できる

`@staticmethod` を使うと、ちょっとしたユーティリティ関数も「どのクラスに属しているか」が明確になり、読みやすく・管理しやすいコードになります。

## 終わりに
クラスの中には「状態に依存しないけど、意味的にはそのクラスに関係がある処理」が意外とよく登場します。
そうしたときに `@staticmethod` を使うと、無理にインスタンスを作る必要もなく、クラス設計もスマートに保てます。
ぜひ、あなたのプロジェクトでも「これ、staticmethod にできるかも？」と意識してみてください！