Ответ
В Python протокол — это неформальный интерфейс, который определяет набор методов, необходимых для поддержки определенного поведения. Классу не нужно явно наследовать протокол; достаточно реализовать соответствующие методы. Этот подход известен как утиная типизация (duck typing).
Ключевые примеры протоколов:
- Протокол итерации: требует методы
__iter__
и__next__
. Позволяет использовать объект в циклеfor
. - Протокол последовательности: требует методы
__len__
и__getitem__
. - Протокол менеджера контекста: требует методы
__enter__
и__exit__
. Позволяет использовать объект с конструкциейwith
.
Пример реализации протокола итерации:
class NumberGenerator:
def __init__(self, max_num):
self.max_num = max_num
self.current = 0
def __iter__(self):
return self
def __next__(self):
if self.current < self.max_num:
self.current += 1
return self.current
else:
raise StopIteration
# Объект поддерживает протокол итерации, поэтому его можно использовать в цикле
for num in NumberGenerator(3):
print(num)
# Вывод:
# 1
# 2
# 3
С версии Python 3.8 для статической проверки типов можно использовать typing.Protocol
, чтобы формально определять протоколы и проверять их реализацию с помощью инструментов вроде mypy
.