Контракт ADT не должен жить только в документации: его записывают в коде через abc.ABC или typing.Protocol, реализуют на двух разных структурах и проверяют общими тестами. Урок продолжает тему ADT и структура данных на Python; сами языковые средства разобраны в уроках про абстрактные классы и generics и протоколы.

Абстрактный Stack, две его реализации и общие тесты контракта
Абстрактный Stack, две его реализации и общие тесты контракта

ABC: интерфейс с принуждением

Класс Stack наследуется от ABC и объявляет push, pop, __len__ абстрактными. Если потомок забыл один из них, при создании объекта вы получите TypeError: ошибка ловится до использования. Готовые методы вроде is_empty достаются всем реализациям бесплатно.

python
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__)
text
TypeError

Две реализации