> Что такое абстрактный класс в Python (Python)

Уровень: junior · Роль: backend · Язык: Python · Категория: Технические вопросы

Компании: К Технологии, Сбер, Т1

Стек: Python

> Пример ответа

Короткий ответ

Абстрактный класс в Python - это класс, который нельзя инстанцировать напрямую. Он служит шаблоном для других классов и может содержать абстрактные методы - методы без реализации, которые обязаны переопределить наследники. Создаётся через наследование от ABC (из модуля abc) и декоратор @abstractmethod. Абстрактные классы позволяют задать общий интерфейс и гарантировать, что подклассы реализуют нужное поведение.

Подробное объяснение

В Python нет встроенного синтаксиса для абстрактных классов, как в Java или C++. Вместо этого используется модуль abc (Abstract Base Classes). Основные компоненты:

  • ABC - базовый класс, от которого нужно наследоваться.
  • @abstractmethod - декоратор для методов, которые должны быть переопределены.
  • @abstractproperty (устарел) или @property + @abstractmethod - для абстрактных свойств.

Ключевые правила:

  • Если в классе есть хотя бы один абстрактный метод, класс становится абстрактным - его нельзя инстанцировать.
  • Подкласс обязан реализовать все абстрактные методы, иначе он тоже останется абстрактным.
  • Абстрактные методы могут иметь реализацию по умолчанию, но наследник всё равно должен её переопределить (или вызвать через super()).
  • Можно использовать @abstractmethod вместе с @classmethod, @staticmethod, @property.

Пример из реальной жизни: базовый класс Payment с абстрактным методом process(), а конкретные CreditCardPayment и PayPalPayment реализуют его по-своему.

На практике

Абстрактные классы полезны для:

  • проектирования API и библиотек - задают контракт для разработчиков;
  • реализации паттернов проектирования, например Template Method или Factory;
  • создания иерархий классов, где есть общее поведение, но конкретные детали различаются;
  • проверки типов - можно использовать isinstance(obj, AbstractClass).

Важно отличать от интерфейсов: в Python нет отдельного понятия интерфейса, абстрактный класс с чисто абстрактными методами фактически играет эту роль. Но в отличие от интерфейсов, абстрактный класс может содержать обычные методы с реализацией, атрибуты и даже __init__.

Пример кода

PYTHON
from abc import ABC, abstractmethod
class Shape(ABC):
def __init__(self, name):
self.name = name
@abstractmethod
def area(self):
"""Вычислить площадь фигуры"""
@abstractmethod
def perimeter(self):
"""Вычислить периметр фигуры"""
def describe(self):
return f"Фигура: {self.name}, площадь: {self.area()}, периметр: {self.perimeter()}"
class Rectangle(Shape):
def __init__(self, width, height):
super().__init__("Прямоугольник")
self.width = width
self.height = height
def area(self):
return self.width * self.height
def perimeter(self):
return 2 * (self.width + self.height)
# shape = Shape("фигура") # TypeError: Can't instantiate abstract class Shape
rect = Rectangle(3, 4)
print(rect.describe()) # Фигура: Прямоугольник, площадь: 12, периметр: 14

Как отвечать на собеседовании

Начни с определения, затем покажи синтаксис на коротком примере. Обязательно упомяни, что абстрактный класс нельзя инстанцировать, и объясни разницу между абстрактным классом и обычным. Если спросят про интерфейсы - скажи, что в Python их роль выполняют абстрактные классы с чисто абстрактными методами. Хорошо добавить пример из практики: например, базовый класс для обработчиков запросов или валидаторов. Не углубляйся в метаклассы, если не спросят - это уровень выше.

Что проверяет интервьюер

  • Понимание принципов ООП: наследование, полиморфизм, абстракция.
  • Знание стандартной библиотеки Python, конкретно модуля abc.
  • Умение объяснить, зачем нужны абстрактные классы и когда их применять.
  • Способность отличить абстрактный класс от интерфейса и от обычного класса.
  • Внимание к деталям: знание, что @abstractmethod работает только с ABC и что подкласс обязан реализовать все абстрактные методы.

Типичные ошибки

  • Забыть унаследоваться от ABC - тогда @abstractmethod не сработает, и класс можно будет инстанцировать.
  • Пытаться создать экземпляр абстрактного класса - получишь TypeError.
  • Не реализовать все абстрактные методы в подклассе - подкласс тоже останется абстрактным, и ошибка проявится только при инстанцировании.
  • Использовать @abstractmethod на обычном методе без ABC - декоратор просто проигнорируется.
  • Путать абстрактный класс с интерфейсом: в Python нет строгого разделения, но абстрактный класс может содержать реализацию, а интерфейс - нет.
  • Переопределять абстрактный метод, но не вызывать super() в __init__, если в базовом классе есть логика инициализации.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью