В чем разница между методами static и class в Python?

Ответ

Декораторы @staticmethod и @classmethod используются для создания методов, связанных с классом, а не с экземпляром. В автотестах они помогают в организации утилит и фабрик.

@staticmethod — статический метод:

  • Не получает ни ссылки на экземпляр (self), ни на класс (cls).
  • Это обычная функция, помещенная в пространство имен класса для логической группировки.
  • Применение в тестах: Вспомогательные, чистые функции (утилиты), не зависящие от состояния класса или экземпляра.

@classmethod — метод класса:

  • Получает ссылку на сам класс (cls) в качестве первого аргумента.
  • Может обращаться к атрибутам класса и изменять их.
  • Применение в тестах: Фабричные методы для создания экземпляров с предопределенной конфигурацией, альтернативные конструкторы.

Практический пример в фреймворке тестирования:

class TestDataFactory:
    DEFAULT_ENV = "staging"

    @staticmethod
    def generate_random_email():
        """Утилита, не зависящая от класса."""
        import uuid
        return f"user_{uuid.uuid4().hex[:8]}@test.com"

    @classmethod
    def get_base_url(cls, environment=None):
        """Метод, использующий атрибут класса DEFAULT_ENV."""
        env = environment or cls.DEFAULT_ENV
        urls = {"staging": "https://stage.api.com", "prod": "https://api.com"}
        return urls.get(env)

    @classmethod
    def for_production(cls):
        """Фабричный метод, возвращающий сконфигурированный объект."""
        cls.DEFAULT_ENV = "prod"  # Меняем состояние класса
        return cls()

# Использование
email = TestDataFactory.generate_random_email()  # Вызов staticmethod
url = TestDataFactory.get_base_url()             # Вызов classmethod
prod_factory = TestDataFactory.for_production()  # Создание фабрики для prod

Итог: Используйте @staticmethod для независимых утилит, @classmethod для методов, работающих с состоянием класса или выступающих в роли фабрик.

Ответ 18+ 🔞

Э, слушай, смотри, объясню на пальцах, а то у некоторых от этих декораторов мозги вскипают, как каша в детсаду. Декораторы @staticmethod и @classmethod — это такие штуки, чтобы методы были привязаны к самому классу, а не к его конкретному экземпляру. В тестах это, блядь, просто золото для порядка.

@staticmethod — это как сосед по лестничной клетке.

  • Вообще нихуя не получает. Ни self, ни cls. Вообще нихуя.
  • Просто функция, которую засунули в класс, чтобы не валялась где попало, для удобства.
  • Где пригодится в тестах: Для всяких утилиток-вспомогашек, которые сами по себе. Чистая математика, генерация данных — там, где состояние класса или объекта вообще похуй.

@classmethod — это уже как управдом.

  • Получает ссылку на сам класс (cls) первым делом. Это важно, ёпта!
  • Может шариться по атрибутам класса и даже их менять — власть, блядь, чувствует.
  • Где пригодится в тестах: Фабрики, блядь! Чтобы создавать объекты с какой-то предустановкой. Или альтернативные конструкторы — красота.

Смотри, как это в деле выглядит, на живом примере:

class TestDataFactory:
    DEFAULT_ENV = "staging"

    @staticmethod
    def generate_random_email():
        """Утилита, не зависящая от класса."""
        import uuid
        return f"user_{uuid.uuid4().hex[:8]}@test.com"

    @classmethod
    def get_base_url(cls, environment=None):
        """Метод, использующий атрибут класса DEFAULT_ENV."""
        env = environment or cls.DEFAULT_ENV
        urls = {"staging": "https://stage.api.com", "prod": "https://api.com"}
        return urls.get(env)

    @classmethod
    def for_production(cls):
        """Фабричный метод, возвращающий сконфигурированный объект."""
        cls.DEFAULT_ENV = "prod"  # Меняем состояние класса
        return cls()

# Использование
email = TestDataFactory.generate_random_email()  # Вызов staticmethod
url = TestDataFactory.get_base_url()             # Вызов classmethod
prod_factory = TestDataFactory.for_production()  # Создание фабрики для prod

Короче, итог, чтобы не пиздеть: @staticmethod — для утилит, которым на класс и его состояние да похуй. @classmethod — когда нужно работать с самим классом (cls) или делать фабрики. Выбирай с умом, а то получится манда с ушами, а не код.