Ответ
Декораторы @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) или делать фабрики. Выбирай с умом, а то получится манда с ушами, а не код.