Сообщить об ошибке.

Класс classmethod в Python, делает функцию методом класса

Позволяет преобразовать обычный метод в метод класса

Синтаксис:

classmethod(function)

Параметры:

  • function - функция, которую следует представить методом класса.

Описание:

Декоратор classmethod() представляет указанную функцию function методом класса. Метод класса получает класс как неявный первый аргумент cls, так же, как метод экземпляра получает экземпляр. Это означает, что можно использовать свойства класса внутри этого метода без создания конкретного экземпляра класса.

Дополнительно смотрите материал "Что такое метод класса и для чего он нужен?".

Декоратор @classmethod является функцией декоратора и привязывает метод к классу, а не к конкретному экземпляру этого класса.

Вызов @classmethod требует дополнительное выделение памяти.

Метод класса может быть вызван либо для класса (например, C.f()), либо для экземпляра (например, C().f()). Экземпляр игнорируется за исключением его класса.

Если метод класса, декорируемый @classmethod вызывается для производного класса, то объект производного класса передается как подразумеваемый первый аргумент.

Декоратор @classmethod используется, когда необходимо получить методы, не относящиеся к конкретному экземпляру класса, но все таки, как то привязанные к этому классу. Эти методы можно переопределять дочерними классами. Следовательно декоратор @classmethod уместно использовать в абстрактных классах для определения того, как метод должен себя вести, когда он вызывается дочерними классами.

Так же его можно использовать когда необходимо получить доступ к свойству класса в целом, а не к свойству конкретного экземпляра этого класса.

Методы класса отличаются от статических методов C++ или Java.

Изменено в Python 3.9: методы класса теперь могут заключать в себе другие дескрипторы, такие как property().

Изменено в Python 3.10: методы класса теперь наследуют атрибуты метода (__module__, __name__, __qualname__, __doc__ и __annotations__) и имеют новый атрибут __wrapped__.

Изменено в Python 3.11: методы класса больше не могут заключать в себе другие дескрипторы, такие как property().

Примеры преобразования обычного метода в метод класса.

class A:
  
    @classmethod
    def method(cls, arg):
        print(f'{cls.__name__}.method => {arg}')
        
    @classmethod
    def call_orig_metod(cls):
        cls.method(5)
        
    def call_metod(self):
        self.method(10)


class ASubclass(A):
    
    @classmethod
    def call_orig_metod(cls):
        cls.method(20)


# Вызываем методы через класс:
>>> A.method(0)
# A.method => 0
>>> A.call_orig_metod()
# A.method => 5
>>> ASubclass.method(0)
# ASubclass.method => 0
>>> ASubclass.call_orig_metod()
# ASubclass.method => 20

# Вызываем методы через объект:
>>> a_obj = A()
>>> a_obj.method(1)
# A.method => 1
>>> a_obj.call_orig_metod()
# A.method => 5
>>> a_obj.call_metod()
# A.method => 10