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Сообщить о неточности