Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗pyOpPtCh 140 of 174 menu
◀ ▶

Проверка соответствия протоколу в 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.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить