<一覧に戻る

クラスメソッドと静的メソッド

オブジェクト指向プログラミング(OOP)において、クラスメソッド静的メソッドは、クラス自体に関連する機能を提供するための重要なメソッドタイプです。これらのメソッドは、インスタンスメソッドとは異なり、クラスレベルで動作します。このセクションでは、Pythonを用いてクラスメソッドと静的メソッドの基本的な概念と実装方法を初心者にもわかりやすく解説します。

クラスメソッドとは?

クラスメソッドは、クラス自体に関連付けられたメソッドであり、クラス全体に影響を与える操作を行うために使用されます。クラスメソッドは、@classmethod デコレーターを使用して定義され、第一引数にクラス自身を指す cls を取ります。

クラスメソッドの定義方法

以下に、クラスメソッドを定義する基本的な方法を示します。

class Dog:
    species = "Canis familiaris"  # クラス変数

    def __init__(self, name, age):
        self.name = name  # インスタンス変数
        self.age = age    # インスタンス変数

    @classmethod
    def get_species(cls):
        return cls.species

    @classmethod
    def create_puppy(cls, name):
        return cls(name, 0)  # 新しいインスタンスを返す

説明

  • @classmethod デコレーター:
  • メソッドをクラスメソッドとして定義するために使用します。

  • 第一引数 cls:

  • クラス自身を指し、クラス変数や他のクラスメソッドにアクセスするために使用します。

  • クラスメソッドの用途:

  • クラス全体に関連する情報を取得する。
  • クラスの新しいインスタンスを生成するファクトリーメソッドとして機能する。

静的メソッドとは?

静的メソッドは、クラスやインスタンスに依存しないメソッドであり、汎用的な機能を提供するために使用されます。静的メソッドは、@staticmethod デコレーターを使用して定義され、第一引数に selfcls を取らない点が特徴です。

静的メソッドの定義方法

以下に、静的メソッドを定義する基本的な方法を示します。

class MathUtils:

    @staticmethod
    def add(a, b):
        return a + b

    @staticmethod
    def multiply(a, b):
        return a * b

説明

  • @staticmethod デコレーター:
  • メソッドを静的メソッドとして定義するために使用します。

  • 静的メソッドの用途:

  • クラスやインスタンスに依存しない汎用的な機能を提供する。
  • ヘルパー関数として機能し、クラスの他の部分と独立して動作する。

クラスメソッドと静的メソッドの違い

特徴 クラスメソッド 静的メソッド
デコレーター @classmethod @staticmethod
第一引数 cls(クラス自身) なし
クラス変数へのアクセス 可能 不可能(クラス変数に直接アクセスできない)
主な用途 クラス全体に関連する操作、ファクトリー 汎用的な機能、ヘルパー関数

クラスメソッドと静的メソッドの使用例

クラスメソッドの使用例

以下に、クラスメソッドを使用して新しいインスタンスを生成するファクトリーメソッドの例を示します。

class Dog:
    species = "Canis familiaris"

    def __init__(self, name, age):
        self.name = name
        self.age = age

    @classmethod
    def get_species(cls):
        return cls.species

    @classmethod
    def create_puppy(cls, name):
        return cls(name, 0)  # 幼犬として年齢を0に設定
# クラスメソッドの呼び出し
print(Dog.get_species())  # 出力: Canis familiaris

# ファクトリーメソッドを使用して新しいインスタンスを生成
puppy = Dog.create_puppy("Buddy")
print(puppy.name)  # 出力: Buddy
print(puppy.age)   # 出力: 0

静的メソッドの使用例

以下に、静的メソッドを使用して数学的な計算を行う例を示します。

class MathUtils:

    @staticmethod
    def add(a, b):
        return a + b

    @staticmethod
    def multiply(a, b):
        return a * b
# 静的メソッドの呼び出し
print(MathUtils.add(5, 3))        # 出力: 8
print(MathUtils.multiply(4, 7))   # 出力: 28

# インスタンスを通じても呼び出せます
math_instance = MathUtils()
print(math_instance.add(10, 20))  # 出力: 30
print(math_instance.multiply(6, 9))  # 出力: 54

実践例:従業員クラスでのクラスメソッドと静的メソッドの活用

以下に、Employee クラスを作成し、クラスメソッドと静的メソッドを活用する例を示します。

class Employee:
    raise_amount = 1.05  # クラス変数

    def __init__(self, name, salary):
        self.name = name
        self.salary = salary

    def apply_raise(self):
        self.salary = int(self.salary * self.raise_amount)

    @classmethod
    def set_raise_amount(cls, amount):
        cls.raise_amount = amount

    @staticmethod
    def is_workday(day):
        # 引数がdatetime.date型であることを想定
        if day.weekday() < 5:
            return True
        return False
from datetime import date

# クラスメソッドの呼び出し
print(Employee.raise_amount)  # 出力: 1.05
Employee.set_raise_amount(1.10)
print(Employee.raise_amount)  # 出力: 1.10

# インスタンスを生成
emp1 = Employee("佐藤", 50000)
emp2 = Employee("鈴木", 60000)

# メソッドの呼び出し
emp1.apply_raise()
print(emp1.salary)  # 出力: 55000
emp2.apply_raise()
print(emp2.salary)  # 出力: 66000

# 静的メソッドの呼び出し
my_date = date(2024, 4, 27)  # 土曜日
print(Employee.is_workday(my_date))  # 出力: False

my_date = date(2024, 4, 29)  # 月曜日
print(Employee.is_workday(my_date))  # 出力: True

説明

  • クラス変数 raise_amount:
  • 全ての Employee インスタンスで共有される昇給率を保持します。

  • クラスメソッド set_raise_amount:

  • クラス全体の raise_amount を変更するために使用します。

  • 静的メソッド is_workday:

  • 指定された日付が平日かどうかを判定する汎用的な関数です。
  • クラスやインスタンスに依存せず、独立した機能を提供します。

  • インスタンスメソッド apply_raise:

  • インスタンスごとの給与に昇給を適用します。

  • 使用例:

  • set_raise_amount クラスメソッドを使用して、全従業員の昇給率を一括で変更。
  • is_workday 静的メソッドを使用して、特定の日付が平日かどうかを判定。

まとめ

  • クラスメソッドは、クラス自体に関連する操作を行うために使用され、@classmethod デコレーターと cls 引数を用いて定義します。主にクラスレベルでの情報取得やファクトリーメソッドとして機能します。

  • 静的メソッドは、クラスやインスタンスに依存しない汎用的な機能を提供するために使用され、@staticmethod デコレーターを用いて定義します。ヘルパー関数としての役割を果たします。

  • クラスメソッドと静的メソッドを適切に使い分けることで、コードの可読性と再利用性を向上させ、クラスの設計をより柔軟かつ効率的に行うことができます。

  • 実際にPythonコードを書いて、クラスメソッドと静的メソッドを実装・使用することで、これらのメソッドの概念と使い方をより深く理解しましょう。

参考資料

出力結果: