0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python初心者】classmethodとstaticmethodの違いと使い方まとめ

0
Posted at

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 を付けると、selfcls を受け取らなくなります。
  • クラスやインスタンスの情報に関係ない処理を、クラスの中にまとめておきたいときに使います。
  • いわゆる「便利関数」をまとめておくイメージです。

まとめ(使い分け)

種類 第一引数 使いどころ 特徴
インスタンスメソッド self インスタンスの情報を使いたいとき インスタンスから呼ぶ
クラスメソッド cls クラス自身を使いたいとき(別の生成方法など) クラスからも呼べる
スタティックメソッド なし クラスにもインスタンスにも関係ない処理 クラスにまとめたい便利関数など

今回は、初心者でも理解しやすい例を使いながら、@classmethod@staticmethod の基本的な違いや使い方を整理してみました。
少しでも理解の助けになればうれしいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?