Назад к вопросам
Middle
88
questionbank

Что такое декоратор в контексте программирования?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Декоратор — это структурный паттерн проектирования, позволяющий динамически добавлять новые обязанности объектам, оборачивая их в специальные объекты-декораторы. Он предоставляет более гибкую альтернативу наследованию для расширения функциональности.

Ключевые идеи:

  • Оборачивание: Декоратор содержит ссылку на оборачиваемый объект.
  • Делегирование: Декоратор делегирует вызовы методов оборачиваемому объекту, при этом может выполнять дополнительную логику до или после вызова.
  • Расширение функциональности: Позволяет добавлять поведение объектам без изменения их структуры или использования подклассов.

Применение в QA Automation:

  • Логирование действий: Добавление логирования к методам взаимодействия с элементами страницы.
  • Обработка исключений: Добавление универсальной обработки исключений к вызовам функций.
  • Повторные попытки: Реализация механизма повторных попыток выполнения flaky тестов или действий.
  • Внедрение пред/пост-условий: Выполнение определенных действий до или после основного шага теста.

Пример на Python:

def log_method_call(func):
    # Декоратор, который логирует вызов функции
    def wrapper(*args, **kwargs):
        print(f"Calling function: {func.__name__} with args: {args}, kwargs: {kwargs}")
        result = func(*args, **kwargs)
        print(f"Function {func.__name__} returned: {result}")
        return result
    return wrapper

class PageObject:
    def __init__(self, driver):
        self.driver = driver

    @log_method_call
    def click_button(self, locator):
        # Пример метода, который использует декоратор
        print(f"Clicking element located by: {locator}")
        # Имитация действия драйвера
        # self.driver.find_element(*locator).click()
        return "Button Clicked"

# Использование
# driver = ... # Инициализация драйвера
# page = PageObject(driver)
# page.click_button(("ID", "submit_button"))