В Python нет интерфейсов, потому приходится так объявлять абстракцию без поведения.
Зачем нужна абстракция -- затем, чтобы код не завязывать на конкретный объект, а завязать на некоторые границы поведения (что и есть абстракция) -- в данном случае на некоторый SUbject
class Observer(ABC):
@abstractmethod
def update(self, subject: Subject) -> None:
"""
Получить обновление от субъекта.
"""
pass
Теперь Observer (все его потомки) в параметрах метода update() принимают ЛЮБОЙ объекта типа Subject, то есть код завязан на абстракцию, а не реализацию этих subjects и вообще ничего не знает о их названиях и индивидуальном поведении, знает только, что прилетит любая абстракция типа Subject....