Что такое абстракция и пример с абстрактным классом и наследованием
Что проверяют
Умеете ли вы перейти от определения к коду. Вопрос ступенчатый: сначала понятие, затем конструкция языка, затем наследование. Для аналитика ценность в том, что абстрактный класс это прямой родственник общей сущности в модели данных, и на нём удобно обсуждать, где обобщение оправдано.
Как отвечать
Абстракция это описание сущности через то, что она умеет, без обещаний о том, как именно. Абстрактный класс закрепляет такой контракт в коде: сам он не создаётся, а наследники обязаны реализовать объявленные методы.
from abc import ABC, abstractmethod
class Payment(ABC):
def __init__(self, amount):
self.amount = amount
@abstractmethod
def charge(self) -> str:
...
def receipt(self) -> str:
return f"{self.charge()}, сумма {self.amount}"
class Card(Payment):
def charge(self) -> str:
return "списание с карты"
class Invoice(Payment):
def charge(self) -> str:
return "выставлен счёт"Объясните два момента. Наследование от ABC обязательно: без него декоратор ничего не запретит и объект создастся. И абстрактный класс отличается от интерфейса тем, что несёт состояние и готовую реализацию: общий метод написан один раз, различающийся отдан наследникам.
Где спотыкаются
Наследуют ради переиспользования кода. Если наследник не подставляется вместо родителя без сюрпризов, связь выбрана неверно и на её месте должна быть композиция.
Заводят абстрактный класс с единственным наследником. Контракт без второй реализации ничего не проверяет и только добавляет слой; обобщать стоит по факту второго случая, а не заранее.
Забывают, что абстрактность в Python держится на метаклассе. Класс, который объявил методы с декоратором, но не унаследовался от ABC, спокойно создаётся, и ошибка всплывает уже в рантайме при вызове пустого метода.