Проверка соответствия протоколу в Python
С помощью isinstance можно проверить,
подходит ли объект под протокол во время
работы программы. Это похоже на instanceof
с интерфейсом в PHP.
Обычный протокол для isinstance
не подходит: без специальной пометки
проверка не сработает и вернет False,
даже если методы у объекта есть.
Нужен декоратор runtime_checkable
над классом протокола:
from typing import Protocol, runtime_checkable
@runtime_checkable
class HasName(Protocol):
def name(self) -> str:
...
Сделаем класс User с методом
name:
class User:
def __init__(self, name):
self.__name = name
def name(self):
return self.__name
Создадим объект и проверим его:
user = User('john')
print(isinstance(user, User)) # True
print(isinstance(user, HasName)) # True
Уберем декоратор runtime_checkable
и повторим проверку. Без него
isinstance с протоколом
вызывает ошибку:
class HasName(Protocol):
def name(self) -> str:
...
print(isinstance(user, HasName)) # ошибка
Сделайте протокол HasSalary
с runtime_checkable и методом
salary.
Сделайте класс Employee и
проверьте isinstance относительно
HasSalary.
Сделайте класс без метода salary
и убедитесь, что isinstance
вернет False.