Типизация: Protocol и duck typing
Python
Senior
Яндекс
Что такое `typing.Protocol` и чем он отличается от обычного абстрактного базового класса (ABC)? Приведите пример duck typing через `Protocol`.
Ответы
Protocol
`Protocol` описывает структурный тип (по набору методов/атрибутов), а не иерархию наследования. Класс считается соответствующим `Protocol`, если у него есть нужные атрибуты, даже если он не наследует этот протокол.
Пример:
```python
from typing import Protocol
class SupportsClose(Protocol):
def close(self) -> None: ...
def cleanup(res: SupportsClose) -> None:
res.close()
class FileWrapper:
def close(self) -> None:
...
cleanup(FileWrapper()) # типchecker доволен
```
В отличие от ABC (`abc.ABC`), где требуется явное наследование, `Protocol` поддерживает duck typing на уровне type checker.