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) в качестве первого аргумента, а не на объект.Может использоваться для работы с классом, например, для изменения состояния класса или создания альтернативных конструкторов.
Вызывается через класс или экземпляр.
Пример
class Person:
species = "Homo sapiens"
def __init__(self, name):
self.name = name
@classmethod
def create_anonymous(cls):
return cls("Anonymous")
@classmethod
def get_species(cls):
return cls.species
p = Person.create_anonymous()
print(p.name) # Anonymous
print(Person.get_species()) # Homo sapiensКлючевые различия
Особенность
@staticmethod
@classmethod
Первый параметр
Нет (self и cls не передаются)
Класс (cls) передаётся автоматически
Доступ к состоянию класса
Нет
Есть
Доступ к состоянию объекта
Нет
Нет
Использование
Функции, связанные с классом логически, без доступа к объекту или классу
Методы, которые работают с классом, например, альтернативные конструкторы
Вызов
Через класс или экземпляр
Через класс или экземпляр
Когда использовать?
@staticmethod— когда нужна утилитарная функция, не зависящая от состояния класса или объекта.@classmethod— когда нужно работать с классом, например, создавать объекты разными способами или менять поведение для подклассов.
Пример с @classmethod — альтернативный конструктор для тестовых данных
@classmethod — альтернативный конструктор для тестовых данныхclass TestUser:
def __init__(self, username, password):
self.username = username
self.password = password
@classmethod
def create_default_user(cls):
# Создаёт объект с дефолтными тестовыми данными
return cls("test_user", "password123")
# Использование
default_user = TestUser.create_default_user()
print(default_user.username) # test_userТакой метод удобно использовать, чтобы быстро создавать типовые объекты для тестов.
Пример с @staticmethod — вспомогательная функция для валидации
@staticmethod — вспомогательная функция для валидацииclass Validator:
@staticmethod
def is_email_valid(email):
return "@" in email and "." in email
# Использование
print(Validator.is_email_valid("user@example.com")) # True
print(Validator.is_email_valid("userexample.com")) # FalseЭто удобно для утилитарных функций, которые не зависят от данных объекта или класса, но логически связаны с ним.
Last updated
Was this helpful?