読者です 読者をやめる 読者になる 読者になる

classmethodとstaticmethodデコレータの違い

Pythonでstaticなメソッドを定義しようとする場合、staticmethodデコレータかclassmethodデコレータを使うことになります。これらの違いは、classmethodデコレータでは第一引数がクラスそのものになるのに対し、staticmethodでは特にそういった制約がない、ということです。この違いが意味を持つのは、クラスの継承が行われた場合です

class Hoge(object):
    name = 'hoge'
    @staticmethod
    def static_method():
        print Hoge.name
    @classmethod
    def class_method(cls):
        print cls.name

上記のようなHogeクラスがあった場合

>>> Hoge.static_method()
hoge
>>> Hoge.class_method()
hoge

と2つのメソッドは全く同じ挙動を示します。ところが、Hogeクラスを継承して

class HogeHoge(Hoge):
   name = 'hogehoge'

を作ると

>>> HogeHoge.static_method()
hoge
>>> HogeHoge.class_method()
hogehoge

となります。これは、継承してもstatic_methodが

print Hoge.name

を評価するのに対し、class_methodでは、継承されたことによってclsがHogeHogeになったことで

print HogeHoge.name

を評価するためです。このように、継承が行われることで参照先まで変わるのがclassmethodの特性です。