:func:`isinstance` checks against :func:`runtime-checkable protocols
<typing.runtime_checkable>` now use :func:`inspect.getattr_static` rather
than :func:`hasattr` to lookup whether attributes exist. This means that
descriptors and :meth:`~object.__getattr__` methods are no longer
unexpectedly evaluated during isinstance() checks against
runtime-checkable protocols. However, it may also mean that some objects
which used to be considered instances of a runtime-checkable protocol may no
longer be considered instances of that protocol on Python 3.12+, and vice
versa. Most users are unlikely to be affected by this change. Patch by Alex
Waygood.