Какова цель базовых классов в Python, если вы уже последовательно ссылаетесь на классы реализации - PullRequest
0 голосов
/ 31 мая 2018

У меня есть несколько классов Python, которые отвечают за проверку файлов, например:

  • валидатор java-файла
  • валидатор html-файла
  • валидатор css-файла
  • валидатор файла javascript

Все эти классы определяют функции validate_file(path) и validate_string(string).

В клиентском коде моего приложения я сохраняю всеэти валидаторы в массиве, и я перебираю все из них и вызываю методы для них точно таким же образом.

Есть ли цель в моем случае определения базового класса "валидатора", который определяет эти методы какАннотация?Как я могу извлечь выгоду из того, что эти отдельные классы соответствуют базовому классу?Или, другими словами, какие функции были бы разблокированы, если бы у меня был базовый класс со всеми этими валидаторами, реализующими его?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Базовые классы в Python служат для обмена деталями реализации и сходствами документов.Нам не нужно , чтобы использовать общий базовый класс для вещей, которые функционируют аналогичным образом, поскольку мы используем протоколы и типизацию утки.Для этих функций проверки у нас может вообще не быть класса;Java предназначена для того, чтобы заставить людей помещать все в классы, но если все, что у вас есть в вашем классе, это один статический метод, то класс - это просто шум.Наличие общего суперкласса позволит вам динамически проверять это, используя isinstance, но тогда я действительно удивлюсь, почему вы обрабатываете их в контексте, в котором вы не знаете, что это такое.Для программиста достаточно простого слова в названии функции.

0 голосов
/ 31 мая 2018

Если вы когда-либо пишете код, который должен обрабатывать смешанные типы, некоторые из которых могут определять метод API, но который не должен считаться «валидаторами», имея общий базовый класс для «true»валидаторы могут быть полезны для предварительной проверки типов и обработки только «истинных» валидаторов, а не просто «вещей, которые выглядят как валидаторы».Тем не менее, чем сложнее имя метода, тем менее вероятно, что вы столкнетесь с такого рода путаницей;шансы другого типа, реализующие действительно нишевое имя метода по совпадению, довольно малы.

Тем не менее, это действительно нишевый вариант использования.Часто, как вы можете видеть, поведение Python при наборе утки само по себе достаточно хорошее;если между различными типами нет общей функциональности, единственное значимое преимущество наличия абстрактного базового класса - для разработчика, а не для самой программы:

  1. Наличие общей точки отсчета для потребителя APIпроясняет, к каким методам у них тоже есть доступ
  2. Для реальных ABC с @abstractmethod декорированными методами он обеспечивает проверку времени определения для подклассов, что лишает сопровождающих возможности пропустить метод случайно
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...