Ответ
Статический метод — это метод, который принадлежит классу, а не его экземпляру (объекту). Он не имеет доступа к состоянию экземпляра (self) или класса (cls).
Для его объявления используется декоратор @staticmethod.
Ключевые особенности:
- Не принимает
selfилиclsв качестве первого обязательного аргумента. - Может быть вызван как на классе, так и на его экземпляре, но результат будет одинаковым.
- Не может изменять состояние объекта или класса.
Когда использовать: Статические методы идеально подходят для создания утилитарных или вспомогательных функций, которые логически связаны с классом, но не зависят от его внутреннего состояния.
Пример:
class TemperatureConverter:
@staticmethod
def celsius_to_fahrenheit(celsius: float) -> float:
"""Конвертирует градусы Цельсия в Фаренгейты."""
return (celsius * 9/5) + 32
# Вызов метода напрямую через класс, без создания экземпляра
fahrenheit = TemperatureConverter.celsius_to_fahrenheit(25)
print(f"25°C is {fahrenheit}°F") # -> 25°C is 77.0°F
Отличие от @classmethod:
@classmethodполучает класс (cls) в качестве первого аргумента и может работать с атрибутами класса (например, для создания фабричных методов).@staticmethodполностью изолирован и ничего не знает о классе или его экземплярах.
Ответ 18+ 🔞
А, слушай, про статические методы! Ну это ж классика, блядь, вечная путаница у всех новичков. Сейчас разжую, как есть.
Представь себе, есть у тебя класс, ну там TemperatureConverter. И внутри него нужна функция, которая градусы переводит. Но ей, сука, похуй на сам этот конвертер — ей не нужны ни self (этот экземпляр), ни cls (сам класс). Она как будто просто висит внутри класса для порядка, чтобы не болталась где-то в модуле одна.
Вот для этого и есть @staticmethod. Кинул этот декоратор сверху — и всё, функция становится статическим методом. Первый аргумент у неё — обычный, какой захочешь. Никакого self, блядь, никакого cls. Она как сирота казанская — работает сама по себе.
Когда это, блядь, использовать? Да когда тебе нужна утилитка, которая логически к классу привязана, но состояния его не трогает. Типа вот эта конвертация градусов — ей похуй, какой там конвертер, ей лишь бы число получить.
Смотри пример, тут всё ясно:
class TemperatureConverter:
@staticmethod
def celsius_to_fahrenheit(celsius: float) -> float:
"""Конвертирует градусы Цельсия в Фаренгейты."""
return (celsius * 9/5) + 32
# Вызываешь прямо из класса, объекты создавать не надо — красота!
fahrenheit = TemperatureConverter.celsius_to_fahrenheit(25)
print(f"25°C is {fahrenheit}°F") # -> 25°C is 77.0°F
А теперь, блядь, главное — не путай с @classmethod! Это другая, ёпта, история. Классовый метод получает первым аргументом cls — сам класс. Он уже может с атрибутами класса шаманить, фабричные методы делать. А статический — это просто функция в коробке класса, и всё. Ничего не знает, никого не трогает. Как монах в келье, блядь.
Запомни: если методу не нужно знать, кто его вызвал (объект или класс) — делай статическим. Если нужно работать с классом — классовый. А если с экземпляром — обычный. Вот и вся, блядь, магия. Не усложняй!