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もクラスメソッドです。
