Sobes.tech
Назад к вопросам
Junior — Middle
61

Можете объяснить, что означает понятие абстрактный класс в объектно-ориентированном программировании?

Компании, где спрашивали
ООО Корпорация ЗНАК
Вкусно и точкаВкусно и точка

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

sobes.tech AI

Что хотят услышать интервьюеры:

Абстрактный класс — это базовый класс, который нельзя создавать напрямую, а можно только наследовать. Он задаёт общий контракт и может содержать как общую реализацию, так и методы, которые обязаны реализовать наследники. В Python это удобно использовать, когда нужно зафиксировать единый интерфейс для группы классов.

Определение:

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

В Python абстрактные классы обычно создают через модуль abc. Если у класса есть хотя бы один абстрактный метод, его нельзя инстанцировать.

Пример использования:

Допустим, есть разные способы оплаты: картой и PayPal. У них разная реализация, но общий интерфейс один — pay().

from abc import ABC, abstractmethod

class Payment(ABC):
    @abstractmethod
    def pay(self, amount):
        pass

    def log(self, amount):
        print(f"Оплата на сумму {amount}")

class CardPayment(Payment):
    def pay(self, amount):
        self.log(amount)
        print("Оплата картой")

class PaypalPayment(Payment):
    def pay(self, amount):
        self.log(amount)
        print("Оплата через PayPal")


payment = CardPayment()
payment.pay(1000)

Пояснение кода:

  • Payment(ABC) — базовый абстрактный класс.
  • @abstractmethod над pay() означает, что у наследников обязана быть своя реализация.
  • Метод log() уже реализован в базовом классе и доступен наследникам.
  • CardPayment и PaypalPayment наследуют Payment и реализуют pay().
  • Попытка создать Payment() вызовет ошибку, потому что класс абстрактный.

Ключевые моменты:

  • Абстрактный класс нельзя создавать напрямую.
  • Он задаёт общий интерфейс и поведение для наследников.
  • Может содержать как абстрактные, так и обычные методы.
  • В Python абстрактные классы реализуются через abc.ABC и @abstractmethod.
  • Полезен, когда нужно заставить все дочерние классы реализовать обязательные методы.