Если вы говорите строго о C # / Java-подобном интерфейсе, то ответ прост. Это понятия, которые относятся к статически типизированным языкам и на самом деле не применяются к динамическим языкам, таким как Python.
Обычный подход к питону - доверять объектам, которые вы получаете, и предполагать, что они обладают необходимыми чертами, которые вам нужны. В противном случае вы можете ожидать ошибки времени выполнения, которые могут быть обработаны или оставлены для вызывающей стороны. Это соответствует общей динамической природе языка: если что-то пойдет не так, вы можете ожидать, что оно всплывет во время выполнения.
Интерфейсы из Java или C #, с другой стороны, являются средством проверки необходимых предварительных условий (то есть объектов, имеющих определенные методы) во время компиляции . Это (возможно) заменяет некоторую гибкость времени выполнения для повышения безопасности проверок во время компиляции.
Обратите внимание, что это не означает, что любая концепция интерфейса не имеет места в динамически типизированном языке. На самом деле, в Python есть слегка размытое понятие «мета-типы», такие как итерации, которые часто проверяются, например, проверяя наличие определенного метода (ов):
def process_sequence(seq):
if not hasattr(seq, '__iter__'):
seq = [seq] # turn single element into iterable
for elem in seq:
process_element(elem)
Это концептуально похоже на не-манифестные интерфейсы языка Go. Если вы хотите иметь свою собственную итерацию, вы просто реализуете метод __iter__
- без явного указания, что будет реализовывать его (как в Java, где вы наследуете от List
класса). Если кто-то захочет проверить, действительно ли ваш объект является итеративным, он может проверить, действительно ли выполнен «контракт», т. Е. Имеющий метод __iter__
. Это то, что андроникус описал в своем ответе.
Как бесстыдный плагин, я могу указать на библиотеку pyduck , которую я реализую. Он нацелен на то, чтобы упростить (и, возможно, даже стандартизировать) проверку таких «контрактов» (путем отражения) и сделать ее несколько более надежной.