bpo-20503: Show how isinstance() works with ABC registered classes. (GH-25175)

This commit is contained in:
Raymond Hettinger 2021-04-05 12:48:24 -07:00 committed by GitHub
parent 75220674c0
commit 7bc25ec727
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1420,6 +1420,41 @@ single class, e.g. ``isinstance(obj, (class1, class2, ...))``, and can also
check whether an object is one of Python's built-in types, e.g.
``isinstance(obj, str)`` or ``isinstance(obj, (int, float, complex))``.
Note that :func:`isinstance` also checks for virtual inheritance from an
:term:`abstract base class`. So, the test will return ``True`` for a
registered class even if hasn't directly or indirectly inherited from it. To
test for "true inheritance", scan the :term:`MRO` of the class:
.. testcode::
from collections.abc import Mapping
class P:
pass
class C(P):
pass
Mapping.register(P)
.. doctest::
>>> c = C()
>>> isinstance(c, C) # direct
True
>>> isinstance(c, P) # indirect
True
>>> isinstance(c, Mapping) # virtual
True
# Actual inheritance chain
>>> type(c).__mro__
(<class 'C'>, <class 'P'>, <class 'object'>)
# Test for "true inheritance"
>>> Mapping in type(c).__mro__
False
Note that most programs do not use :func:`isinstance` on user-defined classes
very often. If you are developing the classes yourself, a more proper
object-oriented style is to define methods on the classes that encapsulate a