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