Skip to content

Commit

Permalink
bpo-20503: Show how isinstance() works with ABC registered classes. (p…
Browse files Browse the repository at this point in the history
  • Loading branch information
rhettinger committed Apr 5, 2021
1 parent 7522067 commit 7bc25ec
Showing 1 changed file with 35 additions and 0 deletions.
35 changes: 35 additions & 0 deletions Doc/faq/programming.rst
Expand Up @@ -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
Expand Down

0 comments on commit 7bc25ec

Please sign in to comment.