В приведенном коде все будет работать и без абстрактных классов. Но если в конце (перед
newspaper.add_news('Сообщение')
) добавить строчку
newspaper.register('abc')
, то лишь выполнение программы закончится с ошибкой. Если код сложнее представленного, ошибка может всплыть совсем не сразу. Тот же Pycharm данную ошибку никак не сможет обнаружить.
А вот если к коду добавить type hints:
from typing import List
from abc import ABC, abstractmethod
class Observer(ABC):
@abstractmethod
def update(self, message: str) -> None:
pass
class Observable(ABC):
@abstractmethod
def register(self, observer: Observer) -> None:
pass
@abstractmethod
def notify_observers(self, message: str) -> None:
pass
class Newspaper(Observable):
def __init__(self) -> None:
self.observers: List[Observer] = []
def register(self, observer: Observer) -> None:
self.observers.append(observer)
def notify_observers(self, message: str) -> None:
for observer in self.observers:
observer.update(message)
def add_news(self, news: str) -> None:
self.notify_observers(news)
class Citizen(Observer):
def __init__(self, name: str) -> None:
self.name = name
def update(self, message: str) -> None:
print('{} получил: {}'.format(self.name, message))
if __name__ == '__main__':
newspaper = Newspaper()
newspaper.register(Citizen('Иван'))
newspaper.register(Citizen('Василий'))
newspaper.register('abc')
newspaper.add_news('Сообщение')
то при использовании Pycharm или mypy они сразу отругаются на ошибку типа:
(VENV~1) D:\My Documents\PycharmProjects\tst>mypy --strict tst105.py
tst105.py:49: error: Argument 1 to "register" of "Newspaper" has incompatible type "str"; expected "Observer"
Т.е., если пишете небольшие программы исключительно для себя в notepad'е - можно и без абстрактных классов и type hints. А вот во всех иных случаях - лучше действовать профессионально.