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の特性です。