クラスメソッド

Pythonにおけるクラスメソッドの概要です。クラスメソッドはインスタンス化しなくても呼び出すことができますが、インスタンスからでも呼び出すことができます。

@classmethod

クラスメソッドの実装には@classmethodデコレータを用います。サンプルコードでは、年月日を保持するクラスを作成し、そこにクラスメソッドとして今日の日付を基準としたインスタンスを生成できるようにしています。なおselfを用いたインスタンス属性(インスタンス変数)にはアクセスできません。

import datetime


class TestClass:

    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

    # クラスメソッド
    @classmethod
    def sample_classmethod(cls, date_diff=0):
        today = datetime.date.today()
        d = today + datetime.timedelta(days=date_diff)
        return cls(d.year, d.month, d.day)


# インスタンス化しないで呼び出し
test_class_1 = TestClass.sample_classmethod()
print(test_class_1.year, test_class_1.month, test_class_1.day)

# インスタンス化しないで呼び出し
test_class_2 = TestClass.sample_classmethod(-10)
print(test_class_2.year, test_class_2.month, test_class_2.day)

# 通常のインスタンス
test_class_3 = TestClass(2000, 1, 1)
print(test_class_3.year, test_class_3.month, test_class_3.day)
2015 11 12
2015 11 2
2000 1 1

※プログラムの実行時間によって結果は異なります。

@classmethodでデコレートされたメソッドはクラスメソッドとなります。インスタンスメソッドの第一引数にはselfが必要ですが、クラスメソッドにはclsが必要です。これはクラス自身を表し、selfが表すクラスのインスタンス自身とは異なります。またclsという引数名は強制ではありませんが、そうすべきであるという暗黙のルールがあります。なおサンプルコードでも利用しているdatetime.date.todayもクラスメソッドです。