Абстрактные классы и методы

Абстрактные классы и методы в Python — это инструмент, который помогает задавать структуру для других классов, чтобы они обязательно реализовали определённые методы.


1. Что такое абстрактный класс

  • Это класс-шаблон, который нельзя напрямую создать (инстанцировать).

  • В нём могут быть как реализованные методы, так и абстрактные методы, которые должны реализовать наследники.

  • Используется для контрактов: мы говорим, что любой класс-наследник обязан иметь определённые методы.


2. Что такое абстрактный метод

  • Метод, который объявлен, но не имеет реализации (тело метода — pass или ...).

  • Декорируется @abstractmethod из модуля abc.

  • Наследник обязан реализовать его, иначе тоже станет абстрактным классом.


3. Как использовать

from abc import ABC, abstractmethod

class BaseTest(ABC):  # Наследуемся от ABC
    @abstractmethod
    def run_test(self):
        """Запускает тест — должен быть реализован в наследнике"""
        pass
    
    def log(self, message):
        print(f"[LOG]: {message}")

# Нельзя создать экземпляр BaseTest — выдаст ошибку
# BaseTest()

class LoginTest(BaseTest):
    def run_test(self):  # Реализуем абстрактный метод
        self.log("Запускаю тест авторизации")
        print("Проверка логина... OK")

test = LoginTest()
test.run_test()

4. Особенности

  • Если класс наследует абстрактный, но не реализует все абстрактные методы, он сам становится абстрактным.

  • Абстрактные классы можно использовать как интерфейсы.

  • Можно создавать частично абстрактные классы, в которых часть методов реализована.


5. Применение в автоматизации тестирования

  • Page Object Model (POM): можно сделать базовый класс страницы с обязательным методом is_open() для проверки, что страница загружена.

  • Фреймворки тестов: базовый тест с методом run_test() или prepare_data(), который обязательно должен быть в каждом тесте.

  • API тесты: базовый клиент с обязательным методом send_request().


6. Пример в Page Object

from abc import ABC, abstractmethod

class BasePage(ABC):
    @abstractmethod
    def is_open(self):
        pass

class LoginPage(BasePage):
    def is_open(self):
        print("Проверка, что страница логина открыта")
        return True

page = LoginPage()
print(page.is_open())

Last updated

Was this helpful?