Python Glossary English

Python 3.8+Аннотации и typingпонятие

typing.Protocol

протокол

Определяет интерфейс через структуру (duck typing). Класс считается совместимым, если реализует все методы Protocol, без явного наследования.

Синтаксис

from typing import Protocol
class MyProtocol(Protocol):
    def method(self) -> type: ...

Protocol пригодится, когда нужно типизировать чужие классы, которые не переделать под наследование от ABC: совместимость определяется набором методов, а не родословной. По умолчанию это чисто статическая история — isinstance с протоколом бросит TypeError, пока класс не помечен декоратором @runtime_checkable, и даже тогда сверяется только наличие атрибутов, а не их сигнатуры.

Примеры

from typing import Protocol
class Drawable(Protocol):
    def draw(self) -> None: ...
class Circle:
    def draw(self) -> None: print('O')
class Square:
    def draw(self) -> None: print('[]')
def render(shape: Drawable) -> None:
    shape.draw()
render(Circle())  # → O
render(Square())  # → []
from typing import Protocol, runtime_checkable
@runtime_checkable
class Drawable(Protocol):
    def draw(self) -> None: ...
class Circle:
    def draw(self) -> None: print('O')
print(isinstance(Circle(), Drawable))  # → True — наследовать не нужно
print(isinstance(42, Drawable))  # → False

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности