Контракт ADT не должен жить только в документации: его записывают в коде через abc.ABC или typing.Protocol, реализуют на двух разных структурах и проверяют общими тестами. Урок продолжает тему ADT и структура данных на Python; сами языковые средства разобраны в уроках про абстрактные классы и generics и протоколы.
ABC: интерфейс с принуждением
Класс Stack наследуется от ABC и объявляет push, pop, __len__ абстрактными. Если потомок забыл один из них, при создании объекта вы получите TypeError: ошибка ловится до использования. Готовые методы вроде is_empty достаются всем реализациям бесплатно.
from abc import ABC, abstractmethod
class Stack(ABC):
@abstractmethod
def push(self, x): ...
@abstractmethod
def pop(self): ...
@abstractmethod
def __len__(self): ...
def is_empty(self):
return len(self) == 0
class Broken(Stack):
def push(self, x):
pass
try:
Broken()
except TypeError as e:
print(type(e).__name__)TypeError