クラスメソッド
Pythonにおけるクラスメソッドの概要です。クラスメソッドはインスタンス化しなくても呼び出すことができますが、インスタンスからでも呼び出すことができます。
クラスメソッドの実装には「@classmethod」デコレータを用います。サンプルコードでは、年月日を保持するクラスを作成し、そこにクラスメソッドとして今日の日付を基準としたインスタンスを生成できるようにしています。なお「self」を用いたインスタンス属性(インスタンス変数)にはアクセスできません。
# -*- coding: utf-8 -*-
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」もクラスメソッドです。
インスタンスにもクラスにも影響しない!?
▶応用編:スタティックメソッド
