Почему нет @override decorator в Python, чтобы обеспечить читаемость кода?

Я использовал абстрактные классы в Python с ABCMeta . Когда вы пишете абстрактный метод, вы помечаете его декоратором @abstractmethod . Одна вещь, которую я нашел нечетной (и в отличие от других языков), заключается в том, что, когда подкласс отменяет метод суперкласса, никакой декоратор, подобный @override не предоставляется. Кто-нибудь знает, какова может быть логика этого?

Это немного смущает кого-то, читающего код, чтобы быстро установить, какие методы переопределяют / реализуют абстрактные методы, а не методы, которые существуют только в подклассе.

Вы смешиваете декодеры Python с аннотациями Java. Несмотря на аналогичный синтаксис, это совершенно разные вещи. Аннотирование Java – это инструкция для компилятора. Но декоратор Python – это исполняемый код, который делает что-то конкретное: он переносит функцию в другую функцию, которая может изменить то, что она делает. Это касается абстрактного метода так же, как и любой другой декоратор; он что-то делает , а именно говорит ABC, что есть метод, который требует переопределения.

Проблема с попыткой добавить @override заключается в том, что при определении времени метода декоратор не может сказать, действительно ли метод переопределяет другой метод. Он не имеет доступа к родительским классам (или к текущему классу, который еще не существует!).

Если вы хотите добавить @override , декоратор @override не сможет выполнить проверку переопределения. У вас есть два варианта. Либо нет проверки переопределения, и в этом случае @override не лучше комментария, или конструктор type должен специально знать о @override и проверять его на время создания класса. Удобная функция, такая как @override действительно не должна усложнять основные части реализации системы типов. Кроме того, если вы случайно положили @override на не-метод, ошибка будет не обнаружена, пока вы не попытаетесь вызвать украшенную функцию и получить странный TypeError.