mirror of
https://github.com/python/cpython.git
synced 2025-11-25 12:44:13 +00:00
bpo-20503: Show how isinstance() works with ABC registered classes. (GH-25175)
This commit is contained in:
parent
75220674c0
commit
7bc25ec727
1 changed files with 35 additions and 0 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue