Ответ 1
В Python немного рассказывается о интерфейсах. Первоначальное отношение, которое продолжалось много лет, заключается в том, что они вам не нужны: Python работает над принципом EAFP (проще просить прощения, чем разрешение). То есть вместо того, чтобы указывать, что вы принимаете объект Ilunable, ICloseable, вы просто пытаетесь close
объект, когда вам нужно, и если он вызывает исключение, тогда возникает исключение.
Итак, в этом менталитете вы просто напишете свои классы отдельно и будете использовать их так, как вы. Если один из них не соответствует требованиям, ваша программа вызовет исключение; наоборот, если вы пишете другой класс с правильными методами, тогда он будет работать, без необходимости указывать, что он реализует ваш конкретный интерфейс.
Это работает очень хорошо, но есть определенные варианты использования интерфейсов, особенно с более крупными проектами программного обеспечения. Окончательное решение в Python состояло в том, чтобы предоставить модуль abc
, который позволяет вам писать абстрактные базовые классы, т.е. классы, которые невозможно создать, если вы не отмените все их методы, Это ваше решение относительно того, думаете ли вы, используя их, того стоит.
PEP, представляющий ABC, объясняет намного лучше, чем я могу:
В области объектно-ориентированного программирования используются шаблоны использования для взаимодействие с объектом можно разделить на две основные категории, которые являются "вызовом" и "проверкой".
Invocation означает взаимодействие с объектом путем вызова его методов. Обычно это сочетается с полиморфизмом, поэтому, ссылаясь на данный метод может запускать другой код в зависимости от типа объекта.
Проверка означает возможность для внешнего кода (вне объектные методы) для изучения типа или свойств этого объекта, и принимать решения о том, как относиться к этому объекту на основе этого информация.
Оба шаблона использования служат одному и тому же общему концу, который должен иметь возможность поддерживать обработку разнообразных и потенциально новых объектов в но в то же время позволяя обрабатывать решения настраивается для каждого типа объекта.
В классической теории ООП, обращение является предпочтительным шаблоном использования, и инспекция активно обескуражена, считаясь реликвией ранее, процедурный стиль программирования. Однако на практике это мнение просто слишком догматична и негибкая, и приводит к своего рода дизайну жесткость, которая очень сильно расходится с динамическим характером язык, такой как Python.
В частности, часто приходится обрабатывать объекты таким образом, чтобы не был создан создателем класса объектов. Это не всегда лучшее решение для построения всех методов объектов, которые удовлетворяют потребности всех возможных пользователей этого объекта. Более того, есть много важных философий отправки, которые находятся в прямой в отличие от классического требования ООП к строгому инкапсулированный внутри объекта, примеры - правило или соответствие шаблону управляемая логика.
С другой стороны, одна из критических замечаний по проверке классическим ООП теоретиками является отсутствие формализма и особый характер того, что проверяются. На языке, таком как Python, в котором почти любой аспект объекта может быть отражен и напрямую доступен внешними кода существует множество способов проверить, соответствует ли объект к определенному протоколу или нет. Например, если спрашивать: "Это объект является контейнером с изменяемой последовательностью? ', можно искать базовый класс из" списка ", или можно искать метод с именем" getitem". Но заметьте что хотя эти тесты могут показаться очевидными, ни одна из них не является правильно, поскольку генерирует ложные негативы, а другой ложный позитивы.
Общепринятое решение состоит в стандартизации тестов и сгруппируйте их в официальную договоренность. Это проще всего сделать сопоставляя каждому классу множество стандартных проверяемых свойств, либо через механизм наследования, либо каким-либо другим способом. Каждый тест несет с собой набор promises: он содержит обещание о общее поведение класса и обещание относительно того, что другой класс методы будут доступны.
Этот PEP предлагает конкретную стратегию для организации этих тестов известных как абстрактные базовые классы или ABC. ABC - это просто классы Python которые добавляются в дерево наследования объектов, чтобы сигнализировать определенные функции этого объекта для внешнего инспектора. Тесты проводятся с использованием isinstance(), а наличие конкретной ABC означает, что тест прошло.
Кроме того, ABC определяют минимальный набор методов, которые устанавливают характерное поведение типа. Код, который различает объекты, основанные на их типе ABC, могут доверять тому, что эти методы будут всегда присутствовать. Каждый из этих методов сопровождается обобщенное абстрактное семантическое определение, описанное в документация для ABC. Эти стандартные семантические определения не являются но настоятельно рекомендуется.
Как и все другие вещи на Python, эти promises имеют характер джентльменское соглашение, которое в этом случае означает, что язык выполняет некоторые из promises, сделанные в ABC, он встает для исполнителя конкретного класса, чтобы гарантировать, что оставшиеся сохраняются.