Что такое статический метод в Python и когда его использовать

Ответ

Статический метод — это метод, который принадлежит классу, а не его экземпляру (объекту). Он не имеет доступа к состоянию экземпляра (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 — сам класс. Он уже может с атрибутами класса шаманить, фабричные методы делать. А статический — это просто функция в коробке класса, и всё. Ничего не знает, никого не трогает. Как монах в келье, блядь.

Запомни: если методу не нужно знать, кто его вызвал (объект или класс) — делай статическим. Если нужно работать с классом — классовый. А если с экземпляром — обычный. Вот и вся, блядь, магия. Не усложняй!