Блог

Python: classmethod / staticmethod

Про @staticmethod уже писал здесь, сейчас просто рассмотрим что такое @classmethod.

Сначала вспомним, что такое staticmethod, здесь показан синтакс для использования @staticmethod декоратора.

class Shuffler( object ):
    @staticmethod
    def shuffle( aDeck ):
        for i in range(len(aDeck)):
            card= aDeck.get( random.randrange(len(aDeck)) )
            aDeck.put( i, card )

d1= Deck()
Shuffler.shuffle( d1 )

А теперь к classmethod.Что такое classmethod – это декоратор, применяющийся для того, чтобы при вызове метода в качестве первого параметра передавался класс, а не экземпляр класса. @classmethod понятие метода класса является относительно специализированных. Так или иначе его применение связано с тем, что иногда нужно модифицировать аттрибуты класса, а не экземпляра (уже после его создания). Метод класса, как правило, используется для “самоанализ” на структуру или определение класса. Это обычно определяется суперкласса, так что все подклассы наследуют необходимые возможности самоанализа. Как правило, методы класса определяются как часть сложных, динамических структур.
Если метод декорирован декоратором classmethod, то метод можно вызывать даже до создания экземпляра класса, такой вызов похож на метод со staticmethod декоратором.
Синтакс, выглядит похоже как и для staticmethod

class C:
    @classmethod
    def f(cls, arg1, arg2, ...): ...

Пример с документации:

import types

class SelfDocumenting(object):
    @classmethod
    def getMethods( aClass ):
        return [ (n,v.__doc__) for n,v in aClass.__dict__.items()
                 if type(v) == types.FunctionType ]
    def help( self ):
        """Part of the self-documenting framework"""
        print self.getMethods()

SelfDocumenting.getMethods()

http://docs.python.org/2/library/functions.html
http://www.itmaybeahack.com/book/python-2.6/html/p03/p03c06_decorators.html