Почему нет @override decorator в Python, чтобы обеспечить читаемость кода?
Я использовал абстрактные классы в Python с ABCMeta
. Когда вы пишете абстрактный метод, вы помечаете его декоратором @abstractmethod
. Одна вещь, которую я нашел нечетной (и в отличие от других языков), заключается в том, что, когда подкласс отменяет метод суперкласса, никакой декоратор, подобный @override
не предоставляется. Кто-нибудь знает, какова может быть логика этого?
Это немного смущает кого-то, читающего код, чтобы быстро установить, какие методы переопределяют / реализуют абстрактные методы, а не методы, которые существуют только в подклассе.
- Почему Python operator.itemgetter работает с заданными запятыми списками чисел в качестве индексов, но не тогда, когда один и тот же список упаковывается в переменную?
- стратегия / шаблон для предотвращения потерянных условий обновления / гонки на GAE / memcache
- Как вы получаете доступ к значениям словаря, когда ключи хранятся в другом объекте?
- Проверка определения sys.argv
- Как настроить многопакетное приложение Python?
Вы смешиваете декодеры Python с аннотациями Java. Несмотря на аналогичный синтаксис, это совершенно разные вещи. Аннотирование Java – это инструкция для компилятора. Но декоратор Python – это исполняемый код, который делает что-то конкретное: он переносит функцию в другую функцию, которая может изменить то, что она делает. Это касается абстрактного метода так же, как и любой другой декоратор; он что-то делает , а именно говорит ABC, что есть метод, который требует переопределения.
Проблема с попыткой добавить @override
заключается в том, что при определении времени метода декоратор не может сказать, действительно ли метод переопределяет другой метод. Он не имеет доступа к родительским классам (или к текущему классу, который еще не существует!).
Если вы хотите добавить @override
, декоратор @override
не сможет выполнить проверку переопределения. У вас есть два варианта. Либо нет проверки переопределения, и в этом случае @override
не лучше комментария, или конструктор type
должен специально знать о @override
и проверять его на время создания класса. Удобная функция, такая как @override
действительно не должна усложнять основные части реализации системы типов. Кроме того, если вы случайно положили @override
на не-метод, ошибка будет не обнаружена, пока вы не попытаетесь вызвать украшенную функцию и получить странный TypeError.
- Возможность изменять настройки во время запуска scrapy из сценария
- ZeroMQ не работает .bind () на Docker на – адрес уже используется. Зачем?
- Как получить имя операционной системы в дружественной манере с помощью Python 2.5?
- Как инициализировать переменные в None / Undefined и сравнивать с другими переменными в Python?
- Доступ к трассировке Python из API C
- список элементов списка счетчиков python и поместить результат в список
- MasterPage как концепция в python
- Отдельные слова в списке, а затем печать позиций этих слов
- Вывод пейджинга из python
- Quirky output python
- locals (). update (kwargs) не работает