Что может наследоваться от класса в Python?

«Что может наследоваться от класса в Python?» — вопрос из категории Python, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Python-фреймворках для тестирования (например, unittest или pytest с классами) наследование активно используется для переиспользования кода. От родительского тест-класса наследуется:

  1. Методы: Все обычные, статические (@staticmethod) и классовые (@classmethod) методы.

    class BaseTest:
        @classmethod
        def setUpClass(cls):
            cls.driver = webdriver.Chrome()  # Инициализация драйвера для всех тестов
            cls.base_url = "https://example.com"
    
        def login(self, user):
            # Общий метод логина
            self.driver.get(f"{self.base_url}/login")
            # ... действия по логину
    
    class TestUserDashboard(BaseTest):  # Наследуется от BaseTest
        def test_dashboard_loads(self):
            # Метод setUpClass уже выполнен, driver доступен
            self.login("test_user")
            self.driver.get(f"{self.base_url}/dashboard")
            assert "Dashboard" in self.driver.title
  2. Атрибуты класса: Переменные, объявленные на уровне класса.

    class BaseTest:
        timeout = 10  # Таймаут по умолчанию
    
    class TestSearch(BaseTest):
        def test_slow_search(self):
            # Использует унаследованный timeout
            element = WebDriverWait(self.driver, self.timeout).until(...)
  3. Декораторы и свойства (@property): Если они объявлены в родительском классе.

Что НЕ наследуется автоматически в контексте тестов:

  • Атрибуты экземпляра (self.var): Они инициализируются в __init__ или setUp методе. Если дочерний класс переопределяет __init__, он должен явно вызвать super().__init__().
  • Фикстуры pytest: В pytest логика переиспользования строится скорее на фикстурах (@pytest.fixture), чем на классическом наследовании, хотя наследование классов тоже работает.

Практика в тестировании: Я создаю базовый класс BaseTest, где выношу общую логику (инициализация драйвера, авторизация, утилитные методы), а затем от него наследую все конкретные тест-сьюты. Это устраняет дублирование кода и упрощает поддержку.