Я не могу найти в них много преимуществ, кроме цели документации. Python предупредит меня, если я забуду реализовать метод, который я определил в ABC, но поскольку я не ссылаюсь на свои объекты по своим интерфейсам, я могу забыть объявить методы в своих интерфейсах, и я не буду уведомлять об этом события. Используется ли обычная практика использования ABC для взаимодействия с интерфейсом?
Является ли pythonic использование интерфейсов/абстрактных базовых классов?
Ответ 1
Лично я считаю, что абстрактные классы наиболее полезны при написании библиотек или другого кода, который взаимодействует между одним разработчиком и другим.
Одним из преимуществ статически типизированных языков является то, что при неправильном типе он не срабатывает раньше (часто, уже во время компиляции). ABC позволяют Python получить такое же преимущество при динамическом вводе текста.
Если ваша утка библиотеки библиотеки представляет собой объект, в котором отсутствует жизненно важный метод, он, вероятно, не сработает, пока этот метод не понадобится (что может занять значительное время или перевести ресурсы в непоследовательное состояние в зависимости от того, как оно используется). Однако при использовании ABC отсутствующий метод не использует правильную ABC (и не выполняет проверку instanceof
) или "проверяется" ABC.
Кроме того, ABC служат отличным способом документировать интерфейсы, как концептуально, так и через докстроны, буквально.
Ответ 2
AFAIK, стандартная практика заключалась в использовании исключения NotImplementedError
для нереализованных абстрактных методов.
Но я считаю, что ABC можно считать pythonic, так как теперь это часть стандартной библиотеки Python.