static методы и classmethod методы в python, различия между ними и примеры использования
В Python есть два типа методов в классах, которые не требуют создания экземпляра для вызова — это @staticmethod и @classmethod.
1. @staticmethod
@staticmethodМетод, который не получает автоматически ни ссылку на объект (
self), ни на класс (cls).Это обычная функция, которая логически связана с классом, но не зависит от состояния объекта или класса.
Вызывается через класс или экземпляр.
Пример
class MathUtils:
@staticmethod
def add(a, b):
return a + b
print(MathUtils.add(5, 3)) # 8
obj = MathUtils()
print(obj.add(10, 7)) # 172. @classmethod
@classmethodМетод, который автоматически получает ссылку на класс (
cls) в качестве первого аргумента, а не на объект.Может использоваться для работы с классом, например, для изменения состояния класса или создания альтернативных конструкторов.
Вызывается через класс или экземпляр.
Пример
Ключевые различия
Особенность
@staticmethod
@classmethod
Первый параметр
Нет (self и cls не передаются)
Класс (cls) передаётся автоматически
Доступ к состоянию класса
Нет
Есть
Доступ к состоянию объекта
Нет
Нет
Использование
Функции, связанные с классом логически, без доступа к объекту или классу
Методы, которые работают с классом, например, альтернативные конструкторы
Вызов
Через класс или экземпляр
Через класс или экземпляр
Когда использовать?
@staticmethod— когда нужна утилитарная функция, не зависящая от состояния класса или объекта.@classmethod— когда нужно работать с классом, например, создавать объекты разными способами или менять поведение для подклассов.
Пример с @classmethod — альтернативный конструктор для тестовых данных
@classmethod — альтернативный конструктор для тестовых данныхТакой метод удобно использовать, чтобы быстро создавать типовые объекты для тестов.
Пример с @staticmethod — вспомогательная функция для валидации
@staticmethod — вспомогательная функция для валидацииЭто удобно для утилитарных функций, которые не зависят от данных объекта или класса, но логически связаны с ним.
Last updated
Was this helpful?