
.. _datamodel:

**********
Data model
**********


.. _objects:

Objects, values and types
=========================

.. index::
   single: object
   single: data

:dfn:`Objects` are Python's abstraction for data.  All data in a Python program
is represented by objects or by relations between objects. Even code is
represented by objects.

.. index::
   pair: built-in function; id
   pair: built-in function; type
   single: identity of an object
   single: value of an object
   single: type of an object
   single: mutable object
   single: immutable object

Every object has an identity, a type and a value.  An object's *identity* never
changes once it has been created; you may think of it as the object's address in
memory.  The :keyword:`is` operator compares the identity of two objects; the
:func:`id` function returns an integer representing its identity.

.. impl-detail::

   For CPython, ``id(x)`` is the memory address where ``x`` is stored.

An object's type determines the operations that the object supports (e.g., "does
it have a length?") and also defines the possible values for objects of that
type.  The :func:`type` function returns an object's type (which is an object
itself).  Like its identity, an object's :dfn:`type` is also unchangeable.
[#]_

The *value* of some objects can change.  Objects whose value can
change are said to be *mutable*; objects whose value is unchangeable once they
are created are called *immutable*. (The value of an immutable container object
that contains a reference to a mutable object can change when the latter's value
is changed; however the container is still considered immutable, because the
collection of objects it contains cannot be changed.  So, immutability is not
strictly the same as having an unchangeable value, it is more subtle.) An
object's mutability is determined by its type; for instance, numbers, strings
and tuples are immutable, while dictionaries and lists are mutable.

.. index::
   single: garbage collection
   single: reference counting
   single: unreachable object

Objects are never explicitly destroyed; however, when they become unreachable
they may be garbage-collected.  An implementation is allowed to postpone garbage
collection or omit it altogether --- it is a matter of implementation quality
how garbage collection is implemented, as long as no objects are collected that
are still reachable.

.. impl-detail::

   CPython currently uses a reference-counting scheme with (optional) delayed
   detection of cyclically linked garbage, which collects most objects as soon
   as they become unreachable, but is not guaranteed to collect garbage
   containing circular references.  See the documentation of the :mod:`gc`
   module for information on controlling the collection of cyclic garbage.
   Other implementations act differently and CPython may change.
   Do not depend on immediate finalization of objects when they become
   unreachable (so you should always close files explicitly).

Note that the use of the implementation's tracing or debugging facilities may
keep objects alive that would normally be collectable. Also note that catching
an exception with a :keyword:`try`...\ :keyword:`except` statement may keep
objects alive.

Some objects contain references to "external" resources such as open files or
windows.  It is understood that these resources are freed when the object is
garbage-collected, but since garbage collection is not guaranteed to happen,
such objects also provide an explicit way to release the external resource,
usually a :meth:`!close` method. Programs are strongly recommended to explicitly
close such objects.  The :keyword:`try`...\ :keyword:`finally` statement
and the :keyword:`with` statement provide convenient ways to do this.

.. index:: single: container

Some objects contain references to other objects; these are called *containers*.
Examples of containers are tuples, lists and dictionaries.  The references are
part of a container's value.  In most cases, when we talk about the value of a
container, we imply the values, not the identities of the contained objects;
however, when we talk about the mutability of a container, only the identities
of the immediately contained objects are implied.  So, if an immutable container
(like a tuple) contains a reference to a mutable object, its value changes if
that mutable object is changed.

Types affect almost all aspects of object behavior.  Even the importance of
object identity is affected in some sense: for immutable types, operations that
compute new values may actually return a reference to any existing object with
the same type and value, while for mutable objects this is not allowed.
For example, after ``a = 1; b = 1``, *a* and *b* may or may not refer to
the same object with the value one, depending on the implementation.
This is because :class:`int` is an immutable type, so the reference to ``1``
can be reused. This behaviour depends on the implementation used, so should
not be relied upon, but is something to be aware of when making use of object
identity tests.
However, after ``c = []; d = []``, *c* and *d* are guaranteed to refer to two
different, unique, newly created empty lists. (Note that ``e = f = []`` assigns
the *same* object to both *e* and *f*.)


.. _types:

The standard type hierarchy
===========================

.. index::
   single: type
   pair: data; type
   pair: type; hierarchy
   pair: extension; module
   pair: C; language

Below is a list of the types that are built into Python.  Extension modules
(written in C, Java, or other languages, depending on the implementation) can
define additional types.  Future versions of Python may add types to the type
hierarchy (e.g., rational numbers, efficiently stored arrays of integers, etc.),
although such additions will often be provided via the standard library instead.

.. index::
   single: attribute
   pair: special; attribute
   triple: generic; special; attribute

Some of the type descriptions below contain a paragraph listing 'special
attributes.'  These are attributes that provide access to the implementation and
are not intended for general use.  Their definition may change in the future.


None
----

.. index:: pair: object; None

This type has a single value.  There is a single object with this value. This
object is accessed through the built-in name ``None``. It is used to signify the
absence of a value in many situations, e.g., it is returned from functions that
don't explicitly return anything. Its truth value is false.


NotImplemented
--------------

.. index:: pair: object; NotImplemented

This type has a single value.  There is a single object with this value. This
object is accessed through the built-in name :data:`NotImplemented`. Numeric methods
and rich comparison methods should return this value if they do not implement the
operation for the operands provided.  (The interpreter will then try the
reflected operation, or some other fallback, depending on the operator.)  It
should not be evaluated in a boolean context.

See
:ref:`implementing-the-arithmetic-operations`
for more details.

.. versionchanged:: 3.9
   Evaluating :data:`NotImplemented` in a boolean context was deprecated.

.. versionchanged:: 3.14
   Evaluating :data:`NotImplemented` in a boolean context now raises a :exc:`TypeError`.
   It previously evaluated to :const:`True` and emitted a :exc:`DeprecationWarning`
   since Python 3.9.


Ellipsis
--------
.. index::
   pair: object; Ellipsis
   single: ...; ellipsis literal

This type has a single value.  There is a single object with this value. This
object is accessed through the literal ``...`` or the built-in name
``Ellipsis``.  Its truth value is true.


:class:`numbers.Number`
-----------------------

.. index:: pair: object; numeric

These are created by numeric literals and returned as results by arithmetic
operators and arithmetic built-in functions.  Numeric objects are immutable;
once created their value never changes.  Python numbers are of course strongly
related to mathematical numbers, but subject to the limitations of numerical
representation in computers.

The string representations of the numeric classes, computed by
:meth:`~object.__repr__` and :meth:`~object.__str__`, have the following
properties:

* They are valid numeric literals which, when passed to their
  class constructor, produce an object having the value of the
  original numeric.

* The representation is in base 10, when possible.

* Leading zeros, possibly excepting a single zero before a
  decimal point, are not shown.

* Trailing zeros, possibly excepting a single zero after a
  decimal point, are not shown.

* A sign is shown only when the number is negative.

Python distinguishes between integers, floating-point numbers, and complex
numbers:


:class:`numbers.Integral`
^^^^^^^^^^^^^^^^^^^^^^^^^

.. index:: pair: object; integer

These represent elements from the mathematical set of integers (positive and
negative).

.. note::
   .. index:: pair: integer; representation

   The rules for integer representation are intended to give the most meaningful
   interpretation of shift and mask operations involving negative integers.

There are two types of integers:

Integers (:class:`int`)
   These represent numbers in an unlimited range, subject to available (virtual)
   memory only.  For the purpose of shift and mask operations, a binary
   representation is assumed, and negative numbers are represented in a variant of
   2's complement which gives the illusion of an infinite string of sign bits
   extending to the left.

Booleans (:class:`bool`)
   .. index::
      pair: object; Boolean
      single: False
      single: True

   These represent the truth values False and True.  The two objects representing
   the values ``False`` and ``True`` are the only Boolean objects. The Boolean type is a
   subtype of the integer type, and Boolean values behave like the values 0 and 1,
   respectively, in almost all contexts, the exception being that when converted to
   a string, the strings ``"False"`` or ``"True"`` are returned, respectively.


.. _datamodel-float:

:class:`numbers.Real` (:class:`float`)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. index::
   pair: object; floating-point
   pair: floating-point; number
   pair: C; language
   pair: Java; language

These represent machine-level double precision floating-point numbers. You are
at the mercy of the underlying machine architecture (and C or Java
implementation) for the accepted range and handling of overflow. Python does not
support single-precision floating-point numbers; the savings in processor and
memory usage that are usually the reason for using these are dwarfed by the
overhead of using objects in Python, so there is no reason to complicate the
language with two kinds of floating-point numbers.


:class:`numbers.Complex` (:class:`complex`)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. index::
   pair: object; complex
   pair: complex; number

These represent complex numbers as a pair of machine-level double precision
floating-point numbers.  The same caveats apply as for floating-point numbers.
The real and imaginary parts of a complex number ``z`` can be retrieved through
the read-only attributes ``z.real`` and ``z.imag``.


Sequences
---------

.. index::
   pair: built-in function; len
   pair: object; sequence
   single: index operation
   single: item selection
   single: subscription

These represent finite ordered sets indexed by non-negative numbers. The
built-in function :func:`len` returns the number of items of a sequence. When
the length of a sequence is *n*, the index set contains the numbers 0, 1,
..., *n*-1.  Item *i* of sequence *a* is selected by ``a[i]``. Some sequences,
including built-in sequences, interpret negative subscripts by adding the
sequence length. For example, ``a[-2]`` equals ``a[n-2]``, the second to last
item of sequence a with length ``n``.

.. index:: single: slicing

Sequences also support slicing: ``a[i:j]`` selects all items with index *k* such
that *i* ``<=`` *k* ``<`` *j*.  When used as an expression, a slice is a
sequence of the same type. The comment above about negative indexes also applies
to negative slice positions.

Some sequences also support "extended slicing" with a third "step" parameter:
``a[i:j:k]`` selects all items of *a* with index *x* where ``x = i + n*k``, *n*
``>=`` ``0`` and *i* ``<=`` *x* ``<`` *j*.

Sequences are distinguished according to their mutability:


Immutable sequences
^^^^^^^^^^^^^^^^^^^

.. index::
   pair: object; immutable sequence
   pair: object; immutable

An object of an immutable sequence type cannot change once it is created.  (If
the object contains references to other objects, these other objects may be
mutable and may be changed; however, the collection of objects directly
referenced by an immutable object cannot change.)

The following types are immutable sequences:

.. index::
   single: string; immutable sequences

Strings
   .. index::
      pair: built-in function; chr
      pair: built-in function; ord
      single: character
      single: integer
      single: Unicode

   A string is a sequence of values that represent Unicode code points.
   All the code points in the range ``U+0000 - U+10FFFF`` can be
   represented in a string.  Python doesn't have a :c:expr:`char` type;
   instead, every code point in the string is represented as a string
   object with length ``1``.  The built-in function :func:`ord`
   converts a code point from its string form to an integer in the
   range ``0 - 10FFFF``; :func:`chr` converts an integer in the range
   ``0 - 10FFFF`` to the corresponding length ``1`` string object.
   :meth:`str.encode` can be used to convert a :class:`str` to
   :class:`bytes` using the given text encoding, and
   :meth:`bytes.decode` can be used to achieve the opposite.

Tuples
   .. index::
      pair: object; tuple
      pair: singleton; tuple
      pair: empty; tuple

   The items of a tuple are arbitrary Python objects. Tuples of two or
   more items are formed by comma-separated lists of expressions.  A tuple
   of one item (a 'singleton') can be formed by affixing a comma to an
   expression (an expression by itself does not create a tuple, since
   parentheses must be usable for grouping of expressions).  An empty
   tuple can be formed by an empty pair of parentheses.

Bytes
   .. index:: bytes, byte

   A bytes object is an immutable array.  The items are 8-bit bytes,
   represented by integers in the range 0 <= x < 256.  Bytes literals
   (like ``b'abc'``) and the built-in :func:`bytes` constructor
   can be used to create bytes objects.  Also, bytes objects can be
   decoded to strings via the :meth:`~bytes.decode` method.


Mutable sequences
^^^^^^^^^^^^^^^^^

.. index::
   pair: object; mutable sequence
   pair: object; mutable
   pair: assignment; statement
   single: subscription
   single: slicing

Mutable sequences can be changed after they are created.  The subscription and
slicing notations can be used as the target of assignment and :keyword:`del`
(delete) statements.

.. note::
   .. index:: pair: module; array
   .. index:: pair: module; collections

   The :mod:`collections` and :mod:`array` module provide
   additional examples of mutable sequence types.

There are currently two intrinsic mutable sequence types:

Lists
   .. index:: pair: object; list

   The items of a list are arbitrary Python objects.  Lists are formed by
   placing a comma-separated list of expressions in square brackets. (Note
   that there are no special cases needed to form lists of length 0 or 1.)

Byte Arrays
   .. index:: bytearray

   A bytearray object is a mutable array. They are created by the built-in
   :func:`bytearray` constructor.  Aside from being mutable
   (and hence unhashable), byte arrays otherwise provide the same interface
   and functionality as immutable :class:`bytes` objects.


Set types
---------

.. index::
   pair: built-in function; len
   pair: object; set type

These represent unordered, finite sets of unique, immutable objects. As such,
they cannot be indexed by any subscript. However, they can be iterated over, and
the built-in function :func:`len` returns the number of items in a set. Common
uses for sets are fast membership testing, removing duplicates from a sequence,
and computing mathematical operations such as intersection, union, difference,
and symmetric difference.

For set elements, the same immutability rules apply as for dictionary keys. Note
that numeric types obey the normal rules for numeric comparison: if two numbers
compare equal (e.g., ``1`` and ``1.0``), only one of them can be contained in a
set.

There are currently two intrinsic set types:


Sets
   .. index:: pair: object; set

   These represent a mutable set. They are created by the built-in :func:`set`
   constructor and can be modified afterwards by several methods, such as
   :meth:`~set.add`.


Frozen sets
   .. index:: pair: object; frozenset

   These represent an immutable set.  They are created by the built-in
   :func:`frozenset` constructor.  As a frozenset is immutable and
   :term:`hashable`, it can be used again as an element of another set, or as
   a dictionary key.


Mappings
--------

.. index::
   pair: built-in function; len
   single: subscription
   pair: object; mapping

These represent finite sets of objects indexed by arbitrary index sets. The
subscript notation ``a[k]`` selects the item indexed by ``k`` from the mapping
``a``; this can be used in expressions and as the target of assignments or
:keyword:`del` statements. The built-in function :func:`len` returns the number
of items in a mapping.

There is currently a single intrinsic mapping type:


Dictionaries
^^^^^^^^^^^^

.. index:: pair: object; dictionary

These represent finite sets of objects indexed by nearly arbitrary values.  The
only types of values not acceptable as keys are values containing lists or
dictionaries or other mutable types that are compared by value rather than by
object identity, the reason being that the efficient implementation of
dictionaries requires a key's hash value to remain constant. Numeric types used
for keys obey the normal rules for numeric comparison: if two numbers compare
equal (e.g., ``1`` and ``1.0``) then they can be used interchangeably to index
the same dictionary entry.

Dictionaries preserve insertion order, meaning that keys will be produced
in the same order they were added sequentially over the dictionary.
Replacing an existing key does not change the order, however removing a key
and re-inserting it will add it to the end instead of keeping its old place.

Dictionaries are mutable; they can be created by the ``{}`` notation (see
section :ref:`dict`).

.. index::
   pair: module; dbm.ndbm
   pair: module; dbm.gnu

The extension modules :mod:`dbm.ndbm` and :mod:`dbm.gnu` provide
additional examples of mapping types, as does the :mod:`collections`
module.

.. versionchanged:: 3.7
   Dictionaries did not preserve insertion order in versions of Python before 3.6.
   In CPython 3.6, insertion order was preserved, but it was considered
   an implementation detail at that time rather than a language guarantee.


Callable types
--------------

.. index::
   pair: object; callable
   pair: function; call
   single: invocation
   pair: function; argument

These are the types to which the function call operation (see section
:ref:`calls`) can be applied:


.. _user-defined-funcs:

User-defined functions
^^^^^^^^^^^^^^^^^^^^^^

.. index::
   pair: user-defined; function
   pair: object; function
   pair: object; user-defined function

A user-defined function object is created by a function definition (see
section :ref:`function`).  It should be called with an argument list
containing the same number of items as the function's formal parameter
list.

Special read-only attributes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. index::
   single: __closure__ (function attribute)
   single: __globals__ (function attribute)
   pair: global; namespace

.. list-table::
   :header-rows: 1

   * - Attribute
     - Meaning

   * - .. attribute:: function.__globals__
     - A reference to the :class:`dictionary <dict>` that holds the function's
       :ref:`global variables <naming>` -- the global namespace of the module
       in which the function was defined.

   * - .. attribute:: function.__closure__
     - ``None`` or a :class:`tuple` of cells that contain bindings for the names specified
       in the :attr:`~codeobject.co_freevars` attribute of the function's
       :attr:`code object <function.__code__>`.

       A cell object has the attribute ``cell_contents``.
       This can be used to get the value of the cell, as well as set the value.

Special writable attributes
~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. index::
   single: __doc__ (function attribute)
   single: __name__ (function attribute)
   single: __module__ (function attribute)
   single: __dict__ (function attribute)
   single: __defaults__ (function attribute)
   single: __code__ (function attribute)
   single: __annotations__ (function attribute)
   single: __annotate__ (function attribute)
   single: __kwdefaults__ (function attribute)
   single: __type_params__ (function attribute)

Most of these attributes check the type of the assigned value:

.. list-table::
   :header-rows: 1

   * - Attribute
     - Meaning

   * - .. attribute:: function.__doc__
     - The function's documentation string, or ``None`` if unavailable.

   * - .. attribute:: function.__name__
     - The function's name.
       See also: :attr:`__name__ attributes <definition.__name__>`.

   * - .. attribute:: function.__qualname__
     - The function's :term:`qualified name`.
       See also: :attr:`__qualname__ attributes <definition.__qualname__>`.

       .. versionadded:: 3.3

   * - .. attribute:: function.__module__
     - The name of the module the function was defined in,
       or ``None`` if unavailable.

   * - .. attribute:: function.__defaults__
     - A :class:`tuple` containing default :term:`parameter` values
       for those parameters that have defaults,
       or ``None`` if no parameters have a default value.

   * - .. attribute:: function.__code__
     - The :ref:`code object <code-objects>` representing
       the compiled function body.

   * - .. attribute:: function.__dict__
     - The namespace supporting arbitrary function attributes.
       See also: :attr:`__dict__ attributes <object.__dict__>`.

   * - .. attribute:: function.__annotations__
     - A :class:`dictionary <dict>` containing annotations of
       :term:`parameters <parameter>`.
       The keys of the dictionary are the parameter names,
       and ``'return'`` for the return annotation, if provided.
       See also: :attr:`object.__annotations__`.

       .. versionchanged:: 3.14
          Annotations are now :ref:`lazily evaluated <lazy-evaluation>`.
          See :pep:`649`.

   * - .. attribute:: function.__annotate__
     - The :term:`annotate function` for this function, or ``None``
       if the function has no annotations. See :attr:`object.__annotate__`.

       .. versionadded:: 3.14

   * - .. attribute:: function.__kwdefaults__
     - A :class:`dictionary <dict>` containing defaults for keyword-only
       :term:`parameters <parameter>`.

   * - .. attribute:: function.__type_params__
     - A :class:`tuple` containing the :ref:`type parameters <type-params>` of
       a :ref:`generic function <generic-functions>`.

       .. versionadded:: 3.12

Function objects also support getting and setting arbitrary attributes, which
can be used, for example, to attach metadata to functions.  Regular attribute
dot-notation is used to get and set such attributes.

.. impl-detail::

   CPython's current implementation only supports function attributes
   on user-defined functions. Function attributes on
   :ref:`built-in functions <builtin-functions>` may be supported in the
   future.

Additional information about a function's definition can be retrieved from its
:ref:`code object <code-objects>`
(accessible via the :attr:`~function.__code__` attribute).


.. _instance-methods:

Instance methods
^^^^^^^^^^^^^^^^

.. index::
   pair: object; method
   pair: object; user-defined method
   pair: user-defined; method

An instance method object combines a class, a class instance and any
callable object (normally a user-defined function).

.. index::
   single: __func__ (method attribute)
   single: __self__ (method attribute)
   single: __doc__ (method attribute)
   single: __name__ (method attribute)
   single: __module__ (method attribute)

Special read-only attributes:

.. list-table::

   * - .. attribute:: method.__self__
     - Refers to the class instance object to which the method is
       :ref:`bound <method-binding>`

   * - .. attribute:: method.__func__
     - Refers to the original :ref:`function object <user-defined-funcs>`

   * - .. attribute:: method.__doc__
     - The method's documentation
       (same as :attr:`method.__func__.__doc__ <function.__doc__>`).
       A :class:`string <str>` if the original function had a docstring, else
       ``None``.

   * - .. attribute:: method.__name__
     - The name of the method
       (same as :attr:`method.__func__.__name__ <function.__name__>`)

   * - .. attribute:: method.__module__
     - The name of the module the method was defined in, or ``None`` if
       unavailable.

Methods also support accessing (but not setting) the arbitrary function
attributes on the underlying :ref:`function object <user-defined-funcs>`.

User-defined method objects may be created when getting an attribute of a
class (perhaps via an instance of that class), if that attribute is a
user-defined :ref:`function object <user-defined-funcs>` or a
:class:`classmethod` object.

.. _method-binding:

When an instance method object is created by retrieving a user-defined
:ref:`function object <user-defined-funcs>` from a class via one of its
instances, its :attr:`~method.__self__` attribute is the instance, and the
method object is said to be *bound*.  The new method's :attr:`~method.__func__`
attribute is the original function object.

When an instance method object is created by retrieving a :class:`classmethod`
object from a class or instance, its :attr:`~method.__self__` attribute is the
class itself, and its :attr:`~method.__func__` attribute is the function object
underlying the class method.

When an instance method object is called, the underlying function
(:attr:`~method.__func__`) is called, inserting the class instance
(:attr:`~method.__self__`) in front of the argument list.  For instance, when
:class:`!C` is a class which contains a definition for a function
:meth:`!f`, and ``x`` is an instance of :class:`!C`, calling ``x.f(1)`` is
equivalent to calling ``C.f(x, 1)``.

When an instance method object is derived from a :class:`classmethod` object, the
"class instance" stored in :attr:`~method.__self__` will actually be the class
itself, so that calling either ``x.f(1)`` or ``C.f(1)`` is equivalent to
calling ``f(C,1)`` where ``f`` is the underlying function.

It is important to note that user-defined functions
which are attributes of a class instance are not converted to bound
methods; this *only* happens when the function is an attribute of the
class.


Generator functions
^^^^^^^^^^^^^^^^^^^

.. index::
   single: generator; function
   single: generator; iterator

A function or method which uses the :keyword:`yield` statement (see section
:ref:`yield`) is called a :dfn:`generator function`.  Such a function, when
called, always returns an :term:`iterator` object which can be used to
execute the body of the function:  calling the iterator's
:meth:`iterator.__next__` method will cause the function to execute until
it provides a value using the :keyword:`!yield` statement.  When the
function executes a :keyword:`return` statement or falls off the end, a
:exc:`StopIteration` exception is raised and the iterator will have
reached the end of the set of values to be returned.


Coroutine functions
^^^^^^^^^^^^^^^^^^^

.. index::
   single: coroutine; function

A function or method which is defined using :keyword:`async def` is called
a :dfn:`coroutine function`.  Such a function, when called, returns a
:term:`coroutine` object.  It may contain :keyword:`await` expressions,
as well as :keyword:`async with` and :keyword:`async for` statements. See
also the :ref:`coroutine-objects` section.


Asynchronous generator functions
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. index::
   single: asynchronous generator; function
   single: asynchronous generator; asynchronous iterator

A function or method which is defined using :keyword:`async def` and
which uses the :keyword:`yield` statement is called a
:dfn:`asynchronous generator function`.  Such a function, when called,
returns an :term:`asynchronous iterator` object which can be used in an
:keyword:`async for` statement to execute the body of the function.

Calling the asynchronous iterator's
:meth:`aiterator.__anext__ <object.__anext__>` method
will return an :term:`awaitable` which when awaited
will execute until it provides a value using the :keyword:`yield`
expression.  When the function executes an empty :keyword:`return`
statement or falls off the end, a :exc:`StopAsyncIteration` exception
is raised and the asynchronous iterator will have reached the end of
the set of values to be yielded.


.. _builtin-functions:

Built-in functions
^^^^^^^^^^^^^^^^^^

.. index::
   pair: object; built-in function
   pair: object; function
   pair: C; language

A built-in function object is a wrapper around a C function.  Examples of
built-in functions are :func:`len` and :func:`math.sin` (:mod:`math` is a
standard built-in module). The number and type of the arguments are
determined by the C function. Special read-only attributes:

* :attr:`!__doc__` is the function's documentation string, or ``None`` if
  unavailable. See :attr:`function.__doc__`.
* :attr:`!__name__` is the function's name. See :attr:`function.__name__`.
* :attr:`!__self__` is set to ``None`` (but see the next item).
* :attr:`!__module__` is the name of
  the module the function was defined in or ``None`` if unavailable.
  See :attr:`function.__module__`.


.. _builtin-methods:

Built-in methods
^^^^^^^^^^^^^^^^

.. index::
   pair: object; built-in method
   pair: object; method
   pair: built-in; method

This is really a different disguise of a built-in function, this time containing
an object passed to the C function as an implicit extra argument.  An example of
a built-in method is ``alist.append()``, assuming *alist* is a list object. In
this case, the special read-only attribute :attr:`!__self__` is set to the object
denoted by *alist*. (The attribute has the same semantics as it does with
:attr:`other instance methods <method.__self__>`.)

.. _classes:

Classes
^^^^^^^

Classes are callable.  These objects normally act as factories for new
instances of themselves, but variations are possible for class types that
override :meth:`~object.__new__`.  The arguments of the call are passed to
:meth:`!__new__` and, in the typical case, to :meth:`~object.__init__` to
initialize the new instance.


Class Instances
^^^^^^^^^^^^^^^

Instances of arbitrary classes can be made callable by defining a
:meth:`~object.__call__` method in their class.


.. _module-objects:

Modules
-------

.. index::
   pair: statement; import
   pair: object; module

Modules are a basic organizational unit of Python code, and are created by
the :ref:`import system <importsystem>` as invoked either by the
:keyword:`import` statement, or by calling
functions such as :func:`importlib.import_module` and built-in
:func:`__import__`.  A module object has a namespace implemented by a
:class:`dictionary <dict>` object (this is the dictionary referenced by the
:attr:`~function.__globals__`
attribute of functions defined in the module).  Attribute references are
translated to lookups in this dictionary, e.g., ``m.x`` is equivalent to
``m.__dict__["x"]``. A module object does not contain the code object used
to initialize the module (since it isn't needed once the initialization is
done).

Attribute assignment updates the module's namespace dictionary, e.g.,
``m.x = 1`` is equivalent to ``m.__dict__["x"] = 1``.

.. index::
   single: __name__ (module attribute)
   single: __spec__ (module attribute)
   single: __package__ (module attribute)
   single: __loader__ (module attribute)
   single: __path__ (module attribute)
   single: __file__ (module attribute)
   single: __doc__ (module attribute)
   single: __annotations__ (module attribute)
   single: __annotate__ (module attribute)
   pair: module; namespace

.. _import-mod-attrs:

Import-related attributes on module objects
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Module objects have the following attributes that relate to the
:ref:`import system <importsystem>`. When a module is created using the machinery associated
with the import system, these attributes are filled in based on the module's
:term:`spec <module spec>`, before the :term:`loader` executes and loads the
module.

To create a module dynamically rather than using the import system,
it's recommended to use :func:`importlib.util.module_from_spec`,
which will set the various import-controlled attributes to appropriate values.
It's also possible to use the :class:`types.ModuleType` constructor to create
modules directly, but this technique is more error-prone, as most attributes
must be manually set on the module object after it has been created when using
this approach.

.. caution::

   With the exception of :attr:`~module.__name__`, it is **strongly**
   recommended that you rely on :attr:`~module.__spec__` and its attributes
   instead of any of the other individual attributes listed in this subsection.
   Note that updating an attribute on :attr:`!__spec__` will not update the
   corresponding attribute on the module itself:

   .. doctest::

     >>> import typing
     >>> typing.__name__, typing.__spec__.name
     ('typing', 'typing')
     >>> typing.__spec__.name = 'spelling'
     >>> typing.__name__, typing.__spec__.name
     ('typing', 'spelling')
     >>> typing.__name__ = 'keyboard_smashing'
     >>> typing.__name__, typing.__spec__.name
     ('keyboard_smashing', 'spelling')

.. attribute:: module.__name__

   The name used to uniquely identify the module in the import system.
   For a directly executed module, this will be set to ``"__main__"``.

   This attribute must be set to the fully qualified name of the module.
   It is expected to match the value of
   :attr:`module.__spec__.name <importlib.machinery.ModuleSpec.name>`.

.. attribute:: module.__spec__

   A record of the module's import-system-related state.

   Set to the :class:`module spec <importlib.machinery.ModuleSpec>` that was
   used when importing the module. See :ref:`module-specs` for more details.

   .. versionadded:: 3.4

.. attribute:: module.__package__

   The :term:`package` a module belongs to.

   If the module is top-level (that is, not a part of any specific package)
   then the attribute should be set to ``''`` (the empty string). Otherwise,
   it should be set to the name of the module's package (which can be equal to
   :attr:`module.__name__` if the module itself is a package). See :pep:`366`
   for further details.

   This attribute is used instead of :attr:`~module.__name__` to calculate
   explicit relative imports for main modules. It defaults to ``None`` for
   modules created dynamically using the :class:`types.ModuleType` constructor;
   use :func:`importlib.util.module_from_spec` instead to ensure the attribute
   is set to a :class:`str`.

   It is **strongly** recommended that you use
   :attr:`module.__spec__.parent <importlib.machinery.ModuleSpec.parent>`
   instead of :attr:`!module.__package__`. :attr:`__package__` is now only used
   as a fallback if :attr:`!__spec__.parent` is not set, and this fallback
   path is deprecated.

   .. versionchanged:: 3.4
      This attribute now defaults to ``None`` for modules created dynamically
      using the :class:`types.ModuleType` constructor.
      Previously the attribute was optional.

   .. versionchanged:: 3.6
      The value of :attr:`!__package__` is expected to be the same as
      :attr:`__spec__.parent <importlib.machinery.ModuleSpec.parent>`.
      :attr:`__package__` is now only used as a fallback during import
      resolution if :attr:`!__spec__.parent` is not defined.

   .. versionchanged:: 3.10
      :exc:`ImportWarning` is raised if an import resolution falls back to
      :attr:`!__package__` instead of
      :attr:`__spec__.parent <importlib.machinery.ModuleSpec.parent>`.

   .. versionchanged:: 3.12
      Raise :exc:`DeprecationWarning` instead of :exc:`ImportWarning` when
      falling back to :attr:`!__package__` during import resolution.

   .. deprecated-removed:: 3.13 3.15
      :attr:`!__package__` will cease to be set or taken into consideration
      by the import system or standard library.

.. attribute:: module.__loader__

   The :term:`loader` object that the import machinery used to load the module.

   This attribute is mostly useful for introspection, but can be used for
   additional loader-specific functionality, for example getting data
   associated with a loader.

   :attr:`!__loader__` defaults to ``None`` for modules created dynamically
   using the :class:`types.ModuleType` constructor;
   use :func:`importlib.util.module_from_spec` instead to ensure the attribute
   is set to a :term:`loader` object.

   It is **strongly** recommended that you use
   :attr:`module.__spec__.loader <importlib.machinery.ModuleSpec.loader>`
   instead of :attr:`!module.__loader__`.

   .. versionchanged:: 3.4
      This attribute now defaults to ``None`` for modules created dynamically
      using the :class:`types.ModuleType` constructor.
      Previously the attribute was optional.

   .. deprecated-removed:: 3.12 3.16
      Setting :attr:`!__loader__` on a module while failing to set
      :attr:`!__spec__.loader` is deprecated. In Python 3.16,
      :attr:`!__loader__` will cease to be set or taken into consideration by
      the import system or the standard library.

.. attribute:: module.__path__

   A (possibly empty) :term:`sequence` of strings enumerating the locations
   where the package's submodules will be found. Non-package modules should
   not have a :attr:`!__path__` attribute. See :ref:`package-path-rules` for
   more details.

   It is **strongly** recommended that you use
   :attr:`module.__spec__.submodule_search_locations <importlib.machinery.ModuleSpec.submodule_search_locations>`
   instead of :attr:`!module.__path__`.

.. attribute:: module.__file__

   :attr:`!__file__` is an optional attribute that
   may or may not be set. Both attributes should be a :class:`str` when they
   are available.

   An optional attribute, :attr:`!__file__` indicates the pathname of the file
   from which the module was loaded (if loaded from a file), or the pathname of
   the shared library file for extension modules loaded dynamically from a
   shared library. It might be missing for certain types of modules, such as C
   modules that are statically linked into the interpreter, and the
   :ref:`import system <importsystem>` may opt to leave it unset if it
   has no semantic meaning (for example, a module loaded from a database).

   .. deprecated-removed:: 3.13 3.15
      Setting ``__cached__`` on a module while failing to set
      :attr:`!__spec__.cached` is deprecated. In Python 3.15,
      ``__cached__`` will cease to be set or taken into consideration by
      the import system or standard library.

   .. versionchanged:: 3.15
      ``__cached__`` is no longer set.

Other writable attributes on module objects
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

As well as the import-related attributes listed above, module objects also have
the following writable attributes:

.. attribute:: module.__doc__

   The module's documentation string, or ``None`` if unavailable.
   See also: :attr:`__doc__ attributes <definition.__doc__>`.

.. attribute:: module.__annotations__

   A dictionary containing :term:`variable annotations <variable annotation>`
   collected during module body execution.  For best practices on working with
   :attr:`!__annotations__`, see :mod:`annotationlib`.

   .. versionchanged:: 3.14
      Annotations are now :ref:`lazily evaluated <lazy-evaluation>`.
      See :pep:`649`.

.. attribute:: module.__annotate__

   The :term:`annotate function` for this module, or ``None`` if the module has
   no annotations. See also: :attr:`~object.__annotate__` attributes.

   .. versionadded:: 3.14

Module dictionaries
^^^^^^^^^^^^^^^^^^^

Module objects also have the following special read-only attribute:

.. index:: single: __dict__ (module attribute)
.. attribute:: module.__dict__

   The module's namespace as a dictionary object. Uniquely among the attributes
   listed here, :attr:`!__dict__` cannot be accessed as a global variable from
   within a module; it can only be accessed as an attribute on module objects.

   .. impl-detail::

      Because of the way CPython clears module dictionaries, the module
      dictionary will be cleared when the module falls out of scope even if the
      dictionary still has live references.  To avoid this, copy the dictionary
      or keep the module around while using its dictionary directly.


.. _class-attrs-and-methods:

Custom classes
--------------

Custom class types are typically created by class definitions (see section
:ref:`class`).  A class has a namespace implemented by a dictionary object.
Class attribute references are translated to lookups in this dictionary, e.g.,
``C.x`` is translated to ``C.__dict__["x"]`` (although there are a number of
hooks which allow for other means of locating attributes). When the attribute
name is not found there, the attribute search continues in the base classes.
This search of the base classes uses the C3 method resolution order which
behaves correctly even in the presence of 'diamond' inheritance structures
where there are multiple inheritance paths leading back to a common ancestor.
Additional details on the C3 MRO used by Python can be found at
:ref:`python_2.3_mro`.

.. index::
   pair: object; class
   pair: object; class instance
   pair: object; instance
   pair: class object; call
   single: container
   pair: object; dictionary
   pair: class; attribute

When a class attribute reference (for class :class:`!C`, say) would yield a
class method object, it is transformed into an instance method object whose
:attr:`~method.__self__` attribute is :class:`!C`.
When it would yield a :class:`staticmethod` object,
it is transformed into the object wrapped by the static method
object. See section :ref:`descriptors` for another way in which attributes
retrieved from a class may differ from those actually contained in its
:attr:`~object.__dict__`.

.. index:: triple: class; attribute; assignment

Class attribute assignments update the class's dictionary, never the dictionary
of a base class.

.. index:: pair: class object; call

A class object can be called (see above) to yield a class instance (see below).

Special attributes
^^^^^^^^^^^^^^^^^^

.. index::
   single: __name__ (class attribute)
   single: __module__ (class attribute)
   single: __dict__ (class attribute)
   single: __bases__ (class attribute)
   single: __base__ (class attribute)
   single: __doc__ (class attribute)
   single: __annotations__ (class attribute)
   single: __annotate__ (class attribute)
   single: __type_params__ (class attribute)
   single: __static_attributes__ (class attribute)
   single: __firstlineno__ (class attribute)

.. list-table::
   :header-rows: 1

   * - Attribute
     - Meaning

   * - .. attribute:: type.__name__
     - The class's name.
       See also: :attr:`__name__ attributes <definition.__name__>`.

   * - .. attribute:: type.__qualname__
     - The class's :term:`qualified name`.
       See also: :attr:`__qualname__ attributes <definition.__qualname__>`.

   * - .. attribute:: type.__module__
     - The name of the module in which the class was defined.

   * - .. attribute:: type.__dict__
     - A :class:`mapping proxy <types.MappingProxyType>`
       providing a read-only view of the class's namespace.
       See also: :attr:`__dict__ attributes <object.__dict__>`.

   * - .. attribute:: type.__bases__
     - A :class:`tuple` containing the class's bases.
       In most cases, for a class defined as ``class X(A, B, C)``,
       ``X.__bases__`` will be exactly equal to ``(A, B, C)``.

   * - .. attribute:: type.__base__
     - .. impl-detail::

          The single base class in the inheritance chain that is responsible
          for the memory layout of instances. This attribute corresponds to
          :c:member:`~PyTypeObject.tp_base` at the C level.

   * - .. attribute:: type.__doc__
     - The class's documentation string, or ``None`` if undefined.
       Not inherited by subclasses.

   * - .. attribute:: type.__annotations__
     - A dictionary containing
       :term:`variable annotations <variable annotation>`
       collected during class body execution. See also:
       :attr:`__annotations__ attributes <object.__annotations__>`.

       For best practices on working with :attr:`~object.__annotations__`,
       please see :mod:`annotationlib`. Use
       :func:`annotationlib.get_annotations` instead of accessing this
       attribute directly.

       .. warning::

          Accessing the :attr:`!__annotations__` attribute directly
          on a class object may return annotations for the wrong class, specifically
          in certain cases where the class, its base class, or a metaclass
          is defined under ``from __future__ import annotations``.
          See :pep:`749 <749#pep749-metaclasses>` for details.

          This attribute does not exist on certain builtin classes. On
          user-defined classes without ``__annotations__``, it is an
          empty dictionary.

       .. versionchanged:: 3.14
          Annotations are now :ref:`lazily evaluated <lazy-evaluation>`.
          See :pep:`649`.

   * - .. method:: type.__annotate__
     - The :term:`annotate function` for this class, or ``None``
       if the class has no annotations.
       See also: :attr:`__annotate__ attributes <object.__annotate__>`.

       .. versionadded:: 3.14

   * - .. attribute:: type.__type_params__
     - A :class:`tuple` containing the :ref:`type parameters <type-params>` of
       a :ref:`generic class <generic-classes>`.

       .. versionadded:: 3.12

   * - .. attribute:: type.__static_attributes__
     - A :class:`tuple` containing names of attributes of this class which are
       assigned through ``self.X`` from any function in its body.

       .. versionadded:: 3.13

   * - .. attribute:: type.__firstlineno__
     - The line number of the first line of the class definition,
       including decorators.
       Setting the :attr:`~type.__module__` attribute removes the
       :attr:`!__firstlineno__` item from the type's dictionary.

       .. versionadded:: 3.13

   * - .. attribute:: type.__mro__
     - The :class:`tuple` of classes that are considered when looking for
       base classes during method resolution.


Special methods
^^^^^^^^^^^^^^^

In addition to the special attributes described above, all Python classes also
have the following two methods available:

.. method:: type.mro

   This method can be overridden by a metaclass to customize the method
   resolution order for its instances.  It is called at class instantiation,
   and its result is stored in :attr:`~type.__mro__`.

.. method:: type.__subclasses__

   Each class keeps a list of weak references to its immediate subclasses. This
   method returns a list of all those references still alive. The list is in
   definition order. Example:

   .. doctest::

      >>> class A: pass
      >>> class B(A): pass
      >>> A.__subclasses__()
      [<class 'B'>]

Class instances
---------------

.. index::
   pair: object; class instance
   pair: object; instance
   pair: class; instance
   pair: class instance; attribute

A class instance is created by calling a class object (see above).  A class
instance has a namespace implemented as a dictionary which is the first place
in which attribute references are searched.  When an attribute is not found
there, and the instance's class has an attribute by that name, the search
continues with the class attributes.  If a class attribute is found that is a
user-defined function object, it is transformed into an instance method
object whose :attr:`~method.__self__` attribute is the instance.  Static method and
class method objects are also transformed; see above under "Classes".  See
section :ref:`descriptors` for another way in which attributes of a class
retrieved via its instances may differ from the objects actually stored in
the class's :attr:`~object.__dict__`.  If no class attribute is found, and the
object's class has a :meth:`~object.__getattr__` method, that is called to satisfy
the lookup.

.. index:: triple: class instance; attribute; assignment

Attribute assignments and deletions update the instance's dictionary, never a
class's dictionary.  If the class has a :meth:`~object.__setattr__` or
:meth:`~object.__delattr__` method, this is called instead of updating the instance
dictionary directly.

.. index::
   pair: object; numeric
   pair: object; sequence
   pair: object; mapping

Class instances can pretend to be numbers, sequences, or mappings if they have
methods with certain special names.  See section :ref:`specialnames`.

Special attributes
^^^^^^^^^^^^^^^^^^

.. index::
   single: __dict__ (instance attribute)
   single: __class__ (instance attribute)

.. attribute:: object.__class__

   The class to which a class instance belongs.

.. attribute:: object.__dict__

   A dictionary or other mapping object used to store an object's (writable)
   attributes. Not all instances have a :attr:`!__dict__` attribute; see the
   section on :ref:`slots` for more details.


I/O objects (also known as file objects)
----------------------------------------

.. index::
   pair: built-in function; open
   pair: module; io
   single: popen() (in module os)
   single: makefile() (socket method)
   single: sys.stdin
   single: sys.stdout
   single: sys.stderr
   single: stdio
   single: stdin (in module sys)
   single: stdout (in module sys)
   single: stderr (in module sys)

A :term:`file object` represents an open file.  Various shortcuts are
available to create file objects: the :func:`open` built-in function, and
also :func:`os.popen`, :func:`os.fdopen`, and the
:meth:`~socket.socket.makefile` method of socket objects (and perhaps by
other functions or methods provided by extension modules).

The objects ``sys.stdin``, ``sys.stdout`` and ``sys.stderr`` are
initialized to file objects corresponding to the interpreter's standard
input, output and error streams; they are all open in text mode and
therefore follow the interface defined by the :class:`io.TextIOBase`
abstract class.


Internal types
--------------

.. index::
   single: internal type
   single: types, internal

A few types used internally by the interpreter are exposed to the user. Their
definitions may change with future versions of the interpreter, but they are
mentioned here for completeness.


.. _code-objects:

Code objects
^^^^^^^^^^^^

.. index:: bytecode, object; code, code object

Code objects represent *byte-compiled* executable Python code, or :term:`bytecode`.
The difference between a code object and a function object is that the function
object contains an explicit reference to the function's globals (the module in
which it was defined), while a code object contains no context; also the default
argument values are stored in the function object, not in the code object
(because they represent values calculated at run-time).  Unlike function
objects, code objects are immutable and contain no references (directly or
indirectly) to mutable objects.

.. index::
   single: co_argcount (code object attribute)
   single: co_posonlyargcount (code object attribute)
   single: co_kwonlyargcount (code object attribute)
   single: co_code (code object attribute)
   single: co_consts (code object attribute)
   single: co_filename (code object attribute)
   single: co_firstlineno (code object attribute)
   single: co_flags (code object attribute)
   single: co_lnotab (code object attribute)
   single: co_name (code object attribute)
   single: co_names (code object attribute)
   single: co_nlocals (code object attribute)
   single: co_stacksize (code object attribute)
   single: co_varnames (code object attribute)
   single: co_cellvars (code object attribute)
   single: co_freevars (code object attribute)
   single: co_qualname (code object attribute)

Special read-only attributes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. list-table::

   * - .. attribute:: codeobject.co_name
     - The function name

   * - .. attribute:: codeobject.co_qualname
     - The fully qualified function name

       .. versionadded:: 3.11

   * - .. attribute:: codeobject.co_argcount
     - The total number of positional :term:`parameters <parameter>`
       (including positional-only parameters and parameters with default values)
       that the function has

   * - .. attribute:: codeobject.co_posonlyargcount
     - The number of positional-only :term:`parameters <parameter>`
       (including arguments with default values) that the function has

   * - .. attribute:: codeobject.co_kwonlyargcount
     - The number of keyword-only :term:`parameters <parameter>`
       (including arguments with default values) that the function has

   * - .. attribute:: codeobject.co_nlocals
     - The number of :ref:`local variables <naming>` used by the function
       (including parameters)

   * - .. attribute:: codeobject.co_varnames
     - A :class:`tuple` containing the names of the local variables in the
       function (starting with the parameter names)

   * - .. attribute:: codeobject.co_cellvars
     - A :class:`tuple` containing the names of :ref:`local variables <naming>`
       that are referenced from at least one :term:`nested scope` inside the function

   * - .. attribute:: codeobject.co_freevars
     - A :class:`tuple` containing the names of
       :term:`free (closure) variables <closure variable>` that a :term:`nested scope`
       references in an outer scope. See also :attr:`function.__closure__`.

       Note: references to global and builtin names are *not* included.

   * - .. attribute:: codeobject.co_code
     - A string representing the sequence of :term:`bytecode` instructions in
       the function

   * - .. attribute:: codeobject.co_consts
     - A :class:`tuple` containing the literals used by the :term:`bytecode` in
       the function

   * - .. attribute:: codeobject.co_names
     - A :class:`tuple` containing the names used by the :term:`bytecode` in
       the function

   * - .. attribute:: codeobject.co_filename
     - The name of the file from which the code was compiled

   * - .. attribute:: codeobject.co_firstlineno
     - The line number of the first line of the function

   * - .. attribute:: codeobject.co_lnotab
     - A string encoding the mapping from :term:`bytecode` offsets to line
       numbers. For details, see the source code of the interpreter.

       .. deprecated:: 3.12
          This attribute of code objects is deprecated, and may be removed in
          Python 3.15.

   * - .. attribute:: codeobject.co_stacksize
     - The required stack size of the code object

   * - .. attribute:: codeobject.co_flags
     - An :class:`integer <int>` encoding a number of flags for the
       interpreter.

.. index:: pair: object; generator

The following flag bits are defined for :attr:`~codeobject.co_flags`:
bit ``0x04`` is set if
the function uses the ``*arguments`` syntax to accept an arbitrary number of
positional arguments; bit ``0x08`` is set if the function uses the
``**keywords`` syntax to accept arbitrary keyword arguments; bit ``0x20`` is set
if the function is a generator. See :ref:`inspect-module-co-flags` for details
on the semantics of each flags that might be present.

Future feature declarations (for example, ``from __future__ import division``) also use bits
in :attr:`~codeobject.co_flags` to indicate whether a code object was compiled with a
particular feature enabled. See :attr:`~__future__._Feature.compiler_flag`.

Other bits in :attr:`~codeobject.co_flags` are reserved for internal use.

.. index:: single: documentation string

If a code object represents a function and has a docstring,
the :data:`~inspect.CO_HAS_DOCSTRING` bit is set in :attr:`~codeobject.co_flags`
and the first item in :attr:`~codeobject.co_consts` is
the docstring of the function.

Methods on code objects
~~~~~~~~~~~~~~~~~~~~~~~

.. method:: codeobject.co_positions()

   Returns an iterable over the source code positions of each :term:`bytecode`
   instruction in the code object.

   The iterator returns :class:`tuple`\s containing the ``(start_line, end_line,
   start_column, end_column)``. The *i-th* tuple corresponds to the
   position of the source code that compiled to the *i-th* code unit.
   Column information is 0-indexed utf-8 byte offsets on the given source
   line.

   This positional information can be missing. A non-exhaustive lists of
   cases where this may happen:

   - Running the interpreter with :option:`-X` ``no_debug_ranges``.
   - Loading a pyc file compiled while using :option:`-X` ``no_debug_ranges``.
   - Position tuples corresponding to artificial instructions.
   - Line and column numbers that can't be represented due to
     implementation specific limitations.

   When this occurs, some or all of the tuple elements can be
   :const:`None`.

   .. versionadded:: 3.11

   .. note::
      This feature requires storing column positions in code objects which may
      result in a small increase of disk usage of compiled Python files or
      interpreter memory usage. To avoid storing the extra information and/or
      deactivate printing the extra traceback information, the
      :option:`-X` ``no_debug_ranges`` command line flag or the :envvar:`PYTHONNODEBUGRANGES`
      environment variable can be used.

.. method:: codeobject.co_lines()

   Returns an iterator that yields information about successive ranges of
   :term:`bytecode`\s. Each item yielded is a ``(start, end, lineno)``
   :class:`tuple`:

   * ``start`` (an :class:`int`) represents the offset (inclusive) of the start
     of the :term:`bytecode` range
   * ``end`` (an :class:`int`) represents the offset (exclusive) of the end of
     the :term:`bytecode` range
   * ``lineno`` is an :class:`int` representing the line number of the
     :term:`bytecode` range, or ``None`` if the bytecodes in the given range
     have no line number

   The items yielded will have the following properties:

   * The first range yielded will have a ``start`` of 0.
   * The ``(start, end)`` ranges will be non-decreasing and consecutive. That
     is, for any pair of :class:`tuple`\s, the ``start`` of the second will be
     equal to the ``end`` of the first.
   * No range will be backwards: ``end >= start`` for all triples.
   * The last :class:`tuple` yielded will have ``end`` equal to the size of the
     :term:`bytecode`.

   Zero-width ranges, where ``start == end``, are allowed. Zero-width ranges
   are used for lines that are present in the source code, but have been
   eliminated by the :term:`bytecode` compiler.

   .. versionadded:: 3.10

   .. seealso::

      :pep:`626` - Precise line numbers for debugging and other tools.
         The PEP that introduced the :meth:`!co_lines` method.

.. method:: codeobject.replace(**kwargs)

   Return a copy of the code object with new values for the specified fields.

   Code objects are also supported by the generic function :func:`copy.replace`.

   .. versionadded:: 3.8


.. _frame-objects:

Frame objects
^^^^^^^^^^^^^

.. index:: pair: object; frame

Frame objects represent execution frames.  They may occur in
:ref:`traceback objects <traceback-objects>`,
and are also passed to registered trace functions.

.. index::
   single: f_back (frame attribute)
   single: f_code (frame attribute)
   single: f_globals (frame attribute)
   single: f_locals (frame attribute)
   single: f_lasti (frame attribute)
   single: f_builtins (frame attribute)
   single: f_generator (frame attribute)

Special read-only attributes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. list-table::

   * - .. attribute:: frame.f_back
     - Points to the previous stack frame (towards the caller),
       or ``None`` if this is the bottom stack frame

   * - .. attribute:: frame.f_code
     - The :ref:`code object <code-objects>` being executed in this frame.
       Accessing this attribute raises an :ref:`auditing event <auditing>`
       ``object.__getattr__`` with arguments ``obj`` and ``"f_code"``.

   * - .. attribute:: frame.f_locals
     - The mapping used by the frame to look up
       :ref:`local variables <naming>`.
       If the frame refers to an :term:`optimized scope`,
       this may return a write-through proxy object.

       .. versionchanged:: 3.13
          Return a proxy for optimized scopes.

   * - .. attribute:: frame.f_globals
     - The dictionary used by the frame to look up
       :ref:`global variables <naming>`

   * - .. attribute:: frame.f_builtins
     - The dictionary used by the frame to look up
       :ref:`built-in (intrinsic) names <naming>`

   * - .. attribute:: frame.f_lasti
     - The "precise instruction" of the frame object
       (this is an index into the :term:`bytecode` string of the
       :ref:`code object <code-objects>`)

   * - .. attribute:: frame.f_generator
     - The :term:`generator` or :term:`coroutine` object that owns this frame,
       or ``None`` if the frame is a normal function.

       .. versionadded:: 3.14

.. index::
   single: f_trace (frame attribute)
   single: f_trace_lines (frame attribute)
   single: f_trace_opcodes (frame attribute)
   single: f_lineno (frame attribute)

Special writable attributes
~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. list-table::

   * - .. attribute:: frame.f_trace
     - If not ``None``, this is a function called for various events during
       code execution (this is used by debuggers). Normally an event is
       triggered for each new source line (see :attr:`~frame.f_trace_lines`).

   * - .. attribute:: frame.f_trace_lines
     - Set this attribute to :const:`False` to disable triggering a tracing
       event for each source line.

   * - .. attribute:: frame.f_trace_opcodes
     - Set this attribute to :const:`True` to allow per-opcode events to be
       requested. Note that this may lead to
       undefined interpreter behaviour if exceptions raised by the trace
       function escape to the function being traced.

   * - .. attribute:: frame.f_lineno
     - The current line number of the frame -- writing to this
       from within a trace function jumps to the given line (only for the bottom-most
       frame).  A debugger can implement a Jump command (aka Set Next Statement)
       by writing to this attribute.

Frame object methods
~~~~~~~~~~~~~~~~~~~~

Frame objects support one method:

.. method:: frame.clear()

   This method clears all references to :ref:`local variables <naming>` held by the
   frame.  Also, if the frame belonged to a :term:`generator`, the generator
   is finalized.  This helps break reference cycles involving frame
   objects (for example when catching an :ref:`exception <bltin-exceptions>`
   and storing its :ref:`traceback <traceback-objects>` for later use).

   :exc:`RuntimeError` is raised if the frame is currently executing
   or suspended.

   .. versionadded:: 3.4

   .. versionchanged:: 3.13
      Attempting to clear a suspended frame raises :exc:`RuntimeError`
      (as has always been the case for executing frames).


.. _traceback-objects:

Traceback objects
^^^^^^^^^^^^^^^^^

.. index::
   pair: object; traceback
   pair: stack; trace
   pair: exception; handler
   pair: execution; stack
   single: exc_info (in module sys)
   single: last_traceback (in module sys)
   single: sys.exc_info
   single: sys.exception
   single: sys.last_traceback

Traceback objects represent the stack trace of an :ref:`exception <tut-errors>`.
A traceback object
is implicitly created when an exception occurs, and may also be explicitly
created by calling :class:`types.TracebackType`.

.. versionchanged:: 3.7
   Traceback objects can now be explicitly instantiated from Python code.

For implicitly created tracebacks, when the search for an exception handler
unwinds the execution stack, at each unwound level a traceback object is
inserted in front of the current traceback.  When an exception handler is
entered, the stack trace is made available to the program. (See section
:ref:`try`.) It is accessible as the third item of the
tuple returned by :func:`sys.exc_info`, and as the
:attr:`~BaseException.__traceback__` attribute
of the caught exception.

When the program contains no suitable
handler, the stack trace is written (nicely formatted) to the standard error
stream; if the interpreter is interactive, it is also made available to the user
as :data:`sys.last_traceback`.

For explicitly created tracebacks, it is up to the creator of the traceback
to determine how the :attr:`~traceback.tb_next` attributes should be linked to
form a full stack trace.

.. index::
   single: tb_frame (traceback attribute)
   single: tb_lineno (traceback attribute)
   single: tb_lasti (traceback attribute)
   pair: statement; try

Special read-only attributes:

.. list-table::

   * - .. attribute:: traceback.tb_frame
     - Points to the execution :ref:`frame <frame-objects>` of the current
       level.

       Accessing this attribute raises an
       :ref:`auditing event <auditing>` ``object.__getattr__`` with arguments
       ``obj`` and ``"tb_frame"``.

   * - .. attribute:: traceback.tb_lineno
     - Gives the line number where the exception occurred

   * - .. attribute:: traceback.tb_lasti
     - Indicates the "precise instruction".

The line number and last instruction in the traceback may differ from the
line number of its :ref:`frame object <frame-objects>` if the exception
occurred in a
:keyword:`try` statement with no matching except clause or with a
:keyword:`finally` clause.

.. index::
   single: tb_next (traceback attribute)

.. attribute:: traceback.tb_next

   The special writable attribute :attr:`!tb_next` is the next level in the
   stack trace (towards the frame where the exception occurred), or ``None`` if
   there is no next level.

   .. versionchanged:: 3.7
      This attribute is now writable


Slice objects
^^^^^^^^^^^^^

.. index:: pair: built-in function; slice

Slice objects are used to represent slices for
:meth:`~object.__getitem__`
methods.  They are also created by the built-in :func:`slice` function.

.. index::
   single: start (slice object attribute)
   single: stop (slice object attribute)
   single: step (slice object attribute)

Special read-only attributes: :attr:`~slice.start` is the lower bound;
:attr:`~slice.stop` is the upper bound; :attr:`~slice.step` is the step
value; each is ``None`` if omitted.  These attributes can have any type.

Slice objects support one method:

.. method:: slice.indices(self, length)

   This method takes a single integer argument *length* and computes
   information about the slice that the slice object would describe if
   applied to a sequence of *length* items.  It returns a tuple of three
   integers; respectively these are the *start* and *stop* indices and the
   *step* or stride length of the slice. Missing or out-of-bounds indices
   are handled in a manner consistent with regular slices.


Static method objects
^^^^^^^^^^^^^^^^^^^^^

Static method objects provide a way of defeating the transformation of function
objects to method objects described above. A static method object is a wrapper
around any other object, usually a user-defined method object. When a static
method object is retrieved from a class or a class instance, the object actually
returned is the wrapped object, which is not subject to any further
transformation. Static method objects are also callable. Static method
objects are created by the built-in :func:`staticmethod` constructor.


Class method objects
^^^^^^^^^^^^^^^^^^^^

A class method object, like a static method object, is a wrapper around another
object that alters the way in which that object is retrieved from classes and
class instances. The behaviour of class method objects upon such retrieval is
described above, under :ref:`"instance methods" <instance-methods>`. Class method objects are created
by the built-in :func:`classmethod` constructor.


.. _specialnames:

Special method names
====================

.. index::
   pair: operator; overloading
   single: __getitem__() (mapping object method)

A class can implement certain operations that are invoked by special syntax
(such as arithmetic operations or subscripting and slicing) by defining methods
with special names. This is Python's approach to :dfn:`operator overloading`,
allowing classes to define their own behavior with respect to language
operators.  For instance, if a class defines a method named
:meth:`~object.__getitem__`,
and ``x`` is an instance of this class, then ``x[i]`` is roughly equivalent
to ``type(x).__getitem__(x, i)``.  Except where mentioned, attempts to execute an
operation raise an exception when no appropriate method is defined (typically
:exc:`AttributeError` or :exc:`TypeError`).

Setting a special method to ``None`` indicates that the corresponding
operation is not available.  For example, if a class sets
:meth:`~object.__iter__` to ``None``, the class is not iterable, so calling
:func:`iter` on its instances will raise a :exc:`TypeError` (without
falling back to :meth:`~object.__getitem__`). [#]_

When implementing a class that emulates any built-in type, it is important that
the emulation only be implemented to the degree that it makes sense for the
object being modelled.  For example, some sequences may work well with retrieval
of individual elements, but extracting a slice may not make sense.
(One example of this is the :ref:`NodeList <dom-nodelist-objects>` interface
in the W3C's Document Object Model.)


.. _customization:

Basic customization
-------------------

.. method:: object.__new__(cls[, ...])

   .. index:: pair: subclassing; immutable types

   Called to create a new instance of class *cls*.  :meth:`__new__` is a static
   method (special-cased so you need not declare it as such) that takes the class
   of which an instance was requested as its first argument.  The remaining
   arguments are those passed to the object constructor expression (the call to the
   class).  The return value of :meth:`__new__` should be the new object instance
   (usually an instance of *cls*).

   Typical implementations create a new instance of the class by invoking the
   superclass's :meth:`__new__` method using ``super().__new__(cls[, ...])``
   with appropriate arguments and then modifying the newly created instance
   as necessary before returning it.

   If :meth:`__new__` is invoked during object construction and it returns an
   instance of *cls*, then the new instance’s :meth:`__init__` method
   will be invoked like ``__init__(self[, ...])``, where *self* is the new instance
   and the remaining arguments are the same as were passed to the object constructor.

   If :meth:`__new__` does not return an instance of *cls*, then the new instance's
   :meth:`__init__` method will not be invoked.

   :meth:`__new__` is intended mainly to allow subclasses of immutable types (like
   int, str, or tuple) to customize instance creation.  It is also commonly
   overridden in custom metaclasses in order to customize class creation.


.. method:: object.__init__(self[, ...])

   .. index:: pair: class; constructor

   Called after the instance has been created (by :meth:`__new__`), but before
   it is returned to the caller.  The arguments are those passed to the
   class constructor expression.  If a base class has an :meth:`__init__`
   method, the derived class's :meth:`__init__` method, if any, must explicitly
   call it to ensure proper initialization of the base class part of the
   instance; for example: ``super().__init__([args...])``.

   Because :meth:`__new__` and :meth:`__init__` work together in constructing
   objects (:meth:`__new__` to create it, and :meth:`__init__` to customize it),
   no non-``None`` value may be returned by :meth:`__init__`; doing so will
   cause a :exc:`TypeError` to be raised at runtime.


.. method:: object.__del__(self)

   .. index::
      single: destructor
      single: finalizer
      pair: statement; del

   Called when the instance is about to be destroyed.  This is also called a
   finalizer or (improperly) a destructor.  If a base class has a
   :meth:`__del__` method, the derived class's :meth:`__del__` method,
   if any, must explicitly call it to ensure proper deletion of the base
   class part of the instance.

   It is possible (though not recommended!) for the :meth:`__del__` method
   to postpone destruction of the instance by creating a new reference to
   it.  This is called object *resurrection*.  It is implementation-dependent
   whether :meth:`__del__` is called a second time when a resurrected object
   is about to be destroyed; the current :term:`CPython` implementation
   only calls it once.

   It is not guaranteed that :meth:`__del__` methods are called for objects
   that still exist when the interpreter exits.
   :class:`weakref.finalize` provides a straightforward way to register
   a cleanup function to be called when an object is garbage collected.

   .. note::

      ``del x`` doesn't directly call ``x.__del__()`` --- the former decrements
      the reference count for ``x`` by one, and the latter is only called when
      ``x``'s reference count reaches zero.

   .. impl-detail::
      It is possible for a reference cycle to prevent the reference count
      of an object from going to zero.  In this case, the cycle will be
      later detected and deleted by the :term:`cyclic garbage collector
      <garbage collection>`.  A common cause of reference cycles is when
      an exception has been caught in a local variable.  The frame's
      locals then reference the exception, which references its own
      traceback, which references the locals of all frames caught in the
      traceback.

      .. seealso::
         Documentation for the :mod:`gc` module.

   .. warning::

      Due to the precarious circumstances under which :meth:`__del__` methods are
      invoked, exceptions that occur during their execution are ignored, and a warning
      is printed to ``sys.stderr`` instead.  In particular:

      * :meth:`__del__` can be invoked when arbitrary code is being executed,
        including from any arbitrary thread.  If :meth:`__del__` needs to take
        a lock or invoke any other blocking resource, it may deadlock as
        the resource may already be taken by the code that gets interrupted
        to execute :meth:`__del__`.

      * :meth:`__del__` can be executed during interpreter shutdown.  As a
        consequence, the global variables it needs to access (including other
        modules) may already have been deleted or set to ``None``. Python
        guarantees that globals whose name begins with a single underscore
        are deleted from their module before other globals are deleted; if
        no other references to such globals exist, this may help in assuring
        that imported modules are still available at the time when the
        :meth:`__del__` method is called.


   .. index::
      single: repr() (built-in function); __repr__() (object method)

.. method:: object.__repr__(self)

   Called by the :func:`repr` built-in function to compute the "official" string
   representation of an object.  If at all possible, this should look like a
   valid Python expression that could be used to recreate an object with the
   same value (given an appropriate environment).  If this is not possible, a
   string of the form ``<...some useful description...>`` should be returned.
   The return value must be a string object. If a class defines :meth:`__repr__`
   but not :meth:`__str__`, then :meth:`__repr__` is also used when an
   "informal" string representation of instances of that class is required.

   This is typically used for debugging, so it is important that the representation
   is information-rich and unambiguous. A default implementation is provided by the
   :class:`object` class itself.

   .. index::
      single: string; __str__() (object method)
      single: format() (built-in function); __str__() (object method)
      single: print() (built-in function); __str__() (object method)


.. method:: object.__str__(self)

   Called by :func:`str(object) <str>`, the default :meth:`__format__` implementation,
   and the built-in function :func:`print`, to compute the "informal" or nicely
   printable string representation of an object.  The return value must be a
   :ref:`str <textseq>` object.

   This method differs from :meth:`object.__repr__` in that there is no
   expectation that :meth:`__str__` return a valid Python expression: a more
   convenient or concise representation can be used.

   The default implementation defined by the built-in type :class:`object`
   calls :meth:`object.__repr__`.

   .. XXX what about subclasses of string?


.. method:: object.__bytes__(self)

   .. index:: pair: built-in function; bytes

   Called by :ref:`bytes <func-bytes>` to compute a byte-string representation
   of an object. This should return a :class:`bytes` object. The :class:`object`
   class itself does not provide this method.

   .. index::
      single: string; __format__() (object method)
      pair: string; conversion
      pair: built-in function; print


.. method:: object.__format__(self, format_spec)

   Called by the :func:`format` built-in function,
   and by extension, evaluation of :ref:`formatted string literals
   <f-strings>` and the :meth:`str.format` method, to produce a "formatted"
   string representation of an object. The *format_spec* argument is
   a string that contains a description of the formatting options desired.
   The interpretation of the *format_spec* argument is up to the type
   implementing :meth:`__format__`, however most classes will either
   delegate formatting to one of the built-in types, or use a similar
   formatting option syntax.

   See :ref:`formatspec` for a description of the standard formatting syntax.

   The return value must be a string object.

   The default implementation by the :class:`object` class should be given
   an empty *format_spec* string. It delegates to :meth:`__str__`.

   .. versionchanged:: 3.4
      The __format__ method of ``object`` itself raises a :exc:`TypeError`
      if passed any non-empty string.

   .. versionchanged:: 3.7
      ``object.__format__(x, '')`` is now equivalent to ``str(x)`` rather
      than ``format(str(x), '')``.


.. _richcmpfuncs:
.. method:: object.__lt__(self, other)
            object.__le__(self, other)
            object.__eq__(self, other)
            object.__ne__(self, other)
            object.__gt__(self, other)
            object.__ge__(self, other)

   .. index::
      single: comparisons

   These are the so-called "rich comparison" methods. The correspondence between
   operator symbols and method names is as follows: ``x<y`` calls ``x.__lt__(y)``,
   ``x<=y`` calls ``x.__le__(y)``, ``x==y`` calls ``x.__eq__(y)``, ``x!=y`` calls
   ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and ``x>=y`` calls
   ``x.__ge__(y)``.

   A rich comparison method may return the singleton :data:`NotImplemented` if it does
   not implement the operation for a given pair of arguments. By convention,
   ``False`` and ``True`` are returned for a successful comparison. However, these
   methods can return any value, so if the comparison operator is used in a Boolean
   context (e.g., in the condition of an ``if`` statement), Python will call
   :func:`bool` on the value to determine if the result is true or false.

   By default, ``object`` implements :meth:`__eq__` by using ``is``, returning
   :data:`NotImplemented` in the case of a false comparison:
   ``True if x is y else NotImplemented``. For :meth:`__ne__`, by default it
   delegates to :meth:`__eq__` and inverts the result unless it is
   :data:`!NotImplemented`.  There are no other implied relationships among the
   comparison operators or default implementations; for example, the truth of
   ``(x<y or x==y)`` does not imply ``x<=y``. To automatically generate ordering
   operations from a single root operation, see :func:`functools.total_ordering`.

   By default, the :class:`object` class provides implementations consistent
   with :ref:`expressions-value-comparisons`: equality compares according to
   object identity, and order comparisons raise :exc:`TypeError`. Each default
   method may generate these results directly, but may also return
   :data:`NotImplemented`.

   See the paragraph on :meth:`__hash__` for
   some important notes on creating :term:`hashable` objects which support
   custom comparison operations and are usable as dictionary keys.

   There are no swapped-argument versions of these methods (to be used when the
   left argument does not support the operation but the right argument does);
   rather, :meth:`__lt__` and :meth:`__gt__` are each other's reflection,
   :meth:`__le__` and :meth:`__ge__` are each other's reflection, and
   :meth:`__eq__` and :meth:`__ne__` are their own reflection.
   If the operands are of different types, and the right operand's type is
   a direct or indirect subclass of the left operand's type,
   the reflected method of the right operand has priority, otherwise
   the left operand's method has priority.  Virtual subclassing is
   not considered.

   When no appropriate method returns any value other than :data:`NotImplemented`, the
   ``==`` and ``!=`` operators will fall back to ``is`` and ``is not``, respectively.

.. method:: object.__hash__(self)

   .. index::
      pair: object; dictionary
      pair: built-in function; hash

   Called by built-in function :func:`hash` and for operations on members of
   hashed collections including :class:`set`, :class:`frozenset`, and
   :class:`dict`.  The ``__hash__()`` method should return an integer. The only required
   property is that objects which compare equal have the same hash value; it is
   advised to mix together the hash values of the components of the object that
   also play a part in comparison of objects by packing them into a tuple and
   hashing the tuple. Example::

       def __hash__(self):
           return hash((self.name, self.nick, self.color))

   .. note::

     :func:`hash` truncates the value returned from an object's custom
     :meth:`__hash__` method to the size of a :c:type:`Py_ssize_t`.  This is
     typically 8 bytes on 64-bit builds and 4 bytes on 32-bit builds.  If an
     object's   :meth:`__hash__` must interoperate on builds of different bit
     sizes, be sure to check the width on all supported builds.  An easy way
     to do this is with
     ``python -c "import sys; print(sys.hash_info.width)"``.

   If a class does not define an :meth:`__eq__` method it should not define a
   :meth:`__hash__` operation either; if it defines :meth:`__eq__` but not
   :meth:`__hash__`, its instances will not be usable as items in hashable
   collections.  If a class defines mutable objects and implements an
   :meth:`__eq__` method, it should not implement :meth:`__hash__`, since the
   implementation of :term:`hashable` collections requires that a key's hash value is
   immutable (if the object's hash value changes, it will be in the wrong hash
   bucket).

   User-defined classes have :meth:`__eq__` and :meth:`__hash__` methods
   by default (inherited from the :class:`object` class); with them, all objects compare
   unequal (except with themselves) and ``x.__hash__()`` returns an appropriate
   value such that ``x == y`` implies both that ``x is y`` and ``hash(x) == hash(y)``.

   A class that overrides :meth:`__eq__` and does not define :meth:`__hash__`
   will have its :meth:`__hash__` implicitly set to ``None``.  When the
   :meth:`__hash__` method of a class is ``None``, instances of the class will
   raise an appropriate :exc:`TypeError` when a program attempts to retrieve
   their hash value, and will also be correctly identified as unhashable when
   checking ``isinstance(obj, collections.abc.Hashable)``.

   If a class that overrides :meth:`__eq__` needs to retain the implementation
   of :meth:`__hash__` from a parent class, the interpreter must be told this
   explicitly by setting ``__hash__ = <ParentClass>.__hash__``.

   If a class that does not override :meth:`__eq__` wishes to suppress hash
   support, it should include ``__hash__ = None`` in the class definition.
   A class which defines its own :meth:`__hash__` that explicitly raises
   a :exc:`TypeError` would be incorrectly identified as hashable by
   an ``isinstance(obj, collections.abc.Hashable)`` call.


   .. note::

      By default, the :meth:`__hash__` values of str and bytes objects are
      "salted" with an unpredictable random value.  Although they
      remain constant within an individual Python process, they are not
      predictable between repeated invocations of Python.

      This is intended to provide protection against a denial-of-service caused
      by carefully chosen inputs that exploit the worst case performance of a
      dict insertion, *O*\ (*n*\ :sup:`2`) complexity.  See
      http://ocert.org/advisories/ocert-2011-003.html for details.

      Changing hash values affects the iteration order of sets.
      Python has never made guarantees about this ordering
      (and it typically varies between 32-bit and 64-bit builds).

      See also :envvar:`PYTHONHASHSEED`.

   .. versionchanged:: 3.3
      Hash randomization is enabled by default.


.. method:: object.__bool__(self)

   .. index:: single: __len__() (mapping object method)

   Called to implement truth value testing and the built-in operation
   ``bool()``; should return ``False`` or ``True``.  When this method is not
   defined, :meth:`~object.__len__` is called, if it is defined, and the object is
   considered true if its result is nonzero.  If a class defines neither
   :meth:`!__len__` nor :meth:`!__bool__` (which is true of the :class:`object`
   class itself), all its instances are considered true.


.. _attribute-access:

Customizing attribute access
----------------------------

The following methods can be defined to customize the meaning of attribute
access (use of, assignment to, or deletion of ``x.name``) for class instances.

.. XXX explain how descriptors interfere here!


.. method:: object.__getattr__(self, name)

   Called when the default attribute access fails with an :exc:`AttributeError`
   (either :meth:`__getattribute__` raises an :exc:`AttributeError` because
   *name* is not an instance attribute or an attribute in the class tree
   for ``self``; or :meth:`__get__` of a *name* property raises
   :exc:`AttributeError`).  This method should either return the (computed)
   attribute value or raise an :exc:`AttributeError` exception.
   The :class:`object` class itself does not provide this method.

   Note that if the attribute is found through the normal mechanism,
   :meth:`__getattr__` is not called.  (This is an intentional asymmetry between
   :meth:`__getattr__` and :meth:`__setattr__`.) This is done both for efficiency
   reasons and because otherwise :meth:`__getattr__` would have no way to access
   other attributes of the instance.  Note that at least for instance variables,
   you can take total control by not inserting any values in the instance attribute
   dictionary (but instead inserting them in another object).  See the
   :meth:`__getattribute__` method below for a way to actually get total control
   over attribute access.


.. method:: object.__getattribute__(self, name)

   Called unconditionally to implement attribute accesses for instances of the
   class. If the class also defines :meth:`__getattr__`, the latter will not be
   called unless :meth:`__getattribute__` either calls it explicitly or raises an
   :exc:`AttributeError`. This method should return the (computed) attribute value
   or raise an :exc:`AttributeError` exception. In order to avoid infinite
   recursion in this method, its implementation should always call the base class
   method with the same name to access any attributes it needs, for example,
   ``object.__getattribute__(self, name)``.

   .. note::

      This method may still be bypassed when looking up special methods as the
      result of implicit invocation via language syntax or
      :ref:`built-in functions <builtin-functions>`.
      See :ref:`special-lookup`.

   .. audit-event:: object.__getattr__ obj,name object.__getattribute__

      For certain sensitive attribute accesses, raises an
      :ref:`auditing event <auditing>` ``object.__getattr__`` with arguments
      ``obj`` and ``name``.


.. method:: object.__setattr__(self, name, value)

   Called when an attribute assignment is attempted.  This is called instead of
   the normal mechanism (i.e. store the value in the instance dictionary).
   *name* is the attribute name, *value* is the value to be assigned to it.

   If :meth:`__setattr__` wants to assign to an instance attribute, it should
   call the base class method with the same name, for example,
   ``object.__setattr__(self, name, value)``.

   .. audit-event:: object.__setattr__ obj,name,value object.__setattr__

      For certain sensitive attribute assignments, raises an
      :ref:`auditing event <auditing>` ``object.__setattr__`` with arguments
      ``obj``, ``name``, ``value``.


.. method:: object.__delattr__(self, name)

   Like :meth:`__setattr__` but for attribute deletion instead of assignment.  This
   should only be implemented if ``del obj.name`` is meaningful for the object.

   .. audit-event:: object.__delattr__ obj,name object.__delattr__

      For certain sensitive attribute deletions, raises an
      :ref:`auditing event <auditing>` ``object.__delattr__`` with arguments
      ``obj`` and ``name``.


.. method:: object.__dir__(self)

   Called when :func:`dir` is called on the object. An iterable must be
   returned. :func:`dir` converts the returned iterable to a list and sorts it.


Customizing module attribute access
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. index::
   single: __getattr__ (module attribute)
   single: __dir__ (module attribute)
   single: __class__ (module attribute)

.. method:: module.__getattr__
            module.__dir__

Special names ``__getattr__`` and ``__dir__`` can be also used to customize
access to module attributes. The ``__getattr__`` function at the module level
should accept one argument which is the name of an attribute and return the
computed value or raise an :exc:`AttributeError`. If an attribute is
not found on a module object through the normal lookup, i.e.
:meth:`object.__getattribute__`, then ``__getattr__`` is searched in
the module ``__dict__`` before raising an :exc:`AttributeError`. If found,
it is called with the attribute name and the result is returned.

The ``__dir__`` function should accept no arguments, and return an iterable of
strings that represents the names accessible on module. If present, this
function overrides the standard :func:`dir` search on a module.

.. attribute:: module.__class__

For a more fine grained customization of the module behavior (setting
attributes, properties, etc.), one can set the ``__class__`` attribute of
a module object to a subclass of :class:`types.ModuleType`. For example::

   import sys
   from types import ModuleType

   class VerboseModule(ModuleType):
       def __repr__(self):
           return f'Verbose {self.__name__}'

       def __setattr__(self, attr, value):
           print(f'Setting {attr}...')
           super().__setattr__(attr, value)

   sys.modules[__name__].__class__ = VerboseModule

.. note::
   Defining module ``__getattr__`` and setting module ``__class__`` only
   affect lookups made using the attribute access syntax -- directly accessing
   the module globals (whether by code within the module, or via a reference
   to the module's globals dictionary) is unaffected.

.. versionchanged:: 3.5
   ``__class__`` module attribute is now writable.

.. versionadded:: 3.7
   ``__getattr__`` and ``__dir__`` module attributes.

.. seealso::

   :pep:`562` - Module __getattr__ and __dir__
      Describes the ``__getattr__`` and ``__dir__`` functions on modules.


.. _descriptors:

Implementing Descriptors
^^^^^^^^^^^^^^^^^^^^^^^^

The following methods only apply when an instance of the class containing the
method (a so-called *descriptor* class) appears in an *owner* class (the
descriptor must be in either the owner's class dictionary or in the class
dictionary for one of its parents).  In the examples below, "the attribute"
refers to the attribute whose name is the key of the property in the owner
class' :attr:`~object.__dict__`.  The :class:`object` class itself does not
implement any of these protocols.

.. method:: object.__get__(self, instance, owner=None)

   Called to get the attribute of the owner class (class attribute access) or
   of an instance of that class (instance attribute access). The optional
   *owner* argument is the owner class, while *instance* is the instance that
   the attribute was accessed through, or ``None`` when the attribute is
   accessed through the *owner*.

   This method should return the computed attribute value or raise an
   :exc:`AttributeError` exception.

   :PEP:`252` specifies that :meth:`__get__` is callable with one or two
   arguments.  Python's own built-in descriptors support this specification;
   however, it is likely that some third-party tools have descriptors
   that require both arguments.  Python's own :meth:`__getattribute__`
   implementation always passes in both arguments whether they are required
   or not.

.. method:: object.__set__(self, instance, value)

   Called to set the attribute on an instance *instance* of the owner class to a
   new value, *value*.

   Note, adding :meth:`__set__` or :meth:`__delete__` changes the kind of
   descriptor to a "data descriptor".  See :ref:`descriptor-invocation` for
   more details.

.. method:: object.__delete__(self, instance)

   Called to delete the attribute on an instance *instance* of the owner class.

Instances of descriptors may also have the :attr:`!__objclass__` attribute
present:

.. attribute:: object.__objclass__

   The attribute :attr:`!__objclass__` is interpreted by the :mod:`inspect` module
   as specifying the class where this object was defined (setting this
   appropriately can assist in runtime introspection of dynamic class attributes).
   For callables, it may indicate that an instance of the given type (or a
   subclass) is expected or required as the first positional argument (for example,
   CPython sets this attribute for unbound methods that are implemented in C).


.. _descriptor-invocation:

Invoking Descriptors
^^^^^^^^^^^^^^^^^^^^

In general, a descriptor is an object attribute with "binding behavior", one
whose attribute access has been overridden by methods in the descriptor
protocol:  :meth:`~object.__get__`, :meth:`~object.__set__`, and
:meth:`~object.__delete__`. If any of
those methods are defined for an object, it is said to be a descriptor.

The default behavior for attribute access is to get, set, or delete the
attribute from an object's dictionary. For instance, ``a.x`` has a lookup chain
starting with ``a.__dict__['x']``, then ``type(a).__dict__['x']``, and
continuing through the base classes of ``type(a)`` excluding metaclasses.

However, if the looked-up value is an object defining one of the descriptor
methods, then Python may override the default behavior and invoke the descriptor
method instead.  Where this occurs in the precedence chain depends on which
descriptor methods were defined and how they were called.

The starting point for descriptor invocation is a binding, ``a.x``. How the
arguments are assembled depends on ``a``:

Direct Call
   The simplest and least common call is when user code directly invokes a
   descriptor method:    ``x.__get__(a)``.

Instance Binding
   If binding to an object instance, ``a.x`` is transformed into the call:
   ``type(a).__dict__['x'].__get__(a, type(a))``.

Class Binding
   If binding to a class, ``A.x`` is transformed into the call:
   ``A.__dict__['x'].__get__(None, A)``.

Super Binding
   A dotted lookup such as ``super(A, a).x`` searches
   ``a.__class__.__mro__`` for a base class ``B`` following ``A`` and then
   returns ``B.__dict__['x'].__get__(a, A)``.  If not a descriptor, ``x`` is
   returned unchanged.

.. testcode::
    :hide:

    class Desc:
        def __get__(*args):
            return args

    class B:

        x = Desc()

    class A(B):

        x = 999

        def m(self):
            'Demonstrate these two descriptor invocations are equivalent'
            result1 = super(A, self).x
            result2 = B.__dict__['x'].__get__(self, A)
            return result1 == result2

.. doctest::
    :hide:

    >>> a = A()
    >>> a.__class__.__mro__.index(B) > a.__class__.__mro__.index(A)
    True
    >>> super(A, a).x == B.__dict__['x'].__get__(a, A)
    True
    >>> a.m()
    True

For instance bindings, the precedence of descriptor invocation depends on
which descriptor methods are defined.  A descriptor can define any combination
of :meth:`~object.__get__`, :meth:`~object.__set__` and
:meth:`~object.__delete__`.  If it does not
define :meth:`!__get__`, then accessing the attribute will return the descriptor
object itself unless there is a value in the object's instance dictionary.  If
the descriptor defines :meth:`!__set__` and/or :meth:`!__delete__`, it is a data
descriptor; if it defines neither, it is a non-data descriptor.  Normally, data
descriptors define both :meth:`!__get__` and :meth:`!__set__`, while non-data
descriptors have just the :meth:`!__get__` method.  Data descriptors with
:meth:`!__get__` and :meth:`!__set__` (and/or :meth:`!__delete__`) defined
always override a redefinition in an
instance dictionary.  In contrast, non-data descriptors can be overridden by
instances.

Python methods (including those decorated with
:deco:`staticmethod` and :deco:`classmethod`) are
implemented as non-data descriptors.  Accordingly, instances can redefine and
override methods.  This allows individual instances to acquire behaviors that
differ from other instances of the same class.

The :func:`property` function is implemented as a data descriptor. Accordingly,
instances cannot override the behavior of a property.


.. _slots:

__slots__
^^^^^^^^^

*__slots__* allow us to explicitly declare data members (like
properties) and deny the creation of :attr:`~object.__dict__` and *__weakref__*
(unless explicitly declared in *__slots__* or available in a parent.)

The space saved over using :attr:`~object.__dict__` can be significant.
Attribute lookup speed can be significantly improved as well.

.. data:: object.__slots__

   This class variable can be assigned a string, iterable, or sequence of
   strings with variable names used by instances.  *__slots__* reserves space
   for the declared variables and prevents the automatic creation of
   :attr:`~object.__dict__`
   and *__weakref__* for each instance.


.. _datamodel-note-slots:

Notes on using *__slots__*:

* When inheriting from a class without *__slots__*, the
  :attr:`~object.__dict__` and
  *__weakref__* attribute of the instances will always be accessible.

* Without a :attr:`~object.__dict__` variable, instances cannot be assigned new
  variables not
  listed in the *__slots__* definition.  Attempts to assign to an unlisted
  variable name raises :exc:`AttributeError`. If dynamic assignment of new
  variables is desired, then add ``'__dict__'`` to the sequence of strings in
  the *__slots__* declaration.

* Without a *__weakref__* variable for each instance, classes defining
  *__slots__* do not support :mod:`weak references <weakref>` to its instances.
  If weak reference
  support is needed, then add ``'__weakref__'`` to the sequence of strings in the
  *__slots__* declaration.

* *__slots__* are implemented at the class level by creating :ref:`descriptors <descriptors>`
  for each variable name.  As a result, class attributes
  cannot be used to set default values for instance variables defined by
  *__slots__*; otherwise, the class attribute would overwrite the descriptor
  assignment.

* The action of a *__slots__* declaration is not limited to the class
  where it is defined.  *__slots__* declared in parents are available in
  child classes. However, instances of a child subclass will get a
  :attr:`~object.__dict__` and *__weakref__* unless the subclass also defines
  *__slots__* (which should only contain names of any *additional* slots).

* If a class defines a slot also defined in a base class, the instance variable
  defined by the base class slot is inaccessible (except by retrieving its
  descriptor directly from the base class). This renders the meaning of the
  program undefined.  In the future, a check may be added to prevent this.

* :exc:`TypeError` will be raised if *__slots__* other than *__dict__* and
  *__weakref__* are defined for a class derived from a
  :c:member:`"variable-length" built-in type <PyTypeObject.tp_itemsize>` such as
  :class:`int`, :class:`bytes`, and :class:`tuple`.

* Any non-string :term:`iterable` may be assigned to *__slots__*.

* If a :class:`dictionary <dict>` is used to assign *__slots__*, the dictionary
  keys will be used as the slot names. The values of the dictionary can be used
  to provide per-attribute docstrings that will be recognised by
  :func:`inspect.getdoc` and displayed in the output of :func:`help`.

* :attr:`~object.__class__` assignment works only if both classes have the
  same *__slots__*.

* :ref:`Multiple inheritance <multiple-inheritance>` with multiple slotted parent
  classes can be used,
  but only one parent is allowed to have attributes created by slots
  (the other bases must have empty slot layouts) - violations raise
  :exc:`TypeError`.

* If an :term:`iterator` is used for *__slots__* then a :term:`descriptor` is
  created for each
  of the iterator's values. However, the *__slots__* attribute will be an empty
  iterator.

.. versionchanged:: next
   Allowed defining the *__dict__* and *__weakref__* *__slots__* for any class.


.. _class-customization:

Customizing class creation
--------------------------

Whenever a class inherits from another class, :meth:`~object.__init_subclass__` is
called on the parent class. This way, it is possible to write classes which
change the behavior of subclasses. This is closely related to class
decorators, but where class decorators only affect the specific class they're
applied to, ``__init_subclass__`` solely applies to future subclasses of the
class defining the method.

.. classmethod:: object.__init_subclass__(cls)

   This method is called whenever the containing class is subclassed.
   *cls* is then the new subclass. If defined as a normal instance method,
   this method is implicitly converted to a class method.

   Keyword arguments which are given to a new class are passed to
   the parent class's ``__init_subclass__``. For compatibility with
   other classes using ``__init_subclass__``, one should take out the
   needed keyword arguments and pass the others over to the base
   class, as in::

       class Philosopher:
           def __init_subclass__(cls, /, default_name, **kwargs):
               super().__init_subclass__(**kwargs)
               cls.default_name = default_name

       class AustralianPhilosopher(Philosopher, default_name="Bruce"):
           pass

   The default implementation ``object.__init_subclass__`` does
   nothing, but raises an error if it is called with any arguments.

   .. note::

      The metaclass hint ``metaclass`` is consumed by the rest of the type
      machinery, and is never passed to ``__init_subclass__`` implementations.
      The actual metaclass (rather than the explicit hint) can be accessed as
      ``type(cls)``.

   .. versionadded:: 3.6


When a class is created, :meth:`!type.__new__` scans the class variables
and makes callbacks to those with a :meth:`~object.__set_name__` hook.

.. method:: object.__set_name__(self, owner, name)

   Automatically called at the time the owning class *owner* is
   created. The object has been assigned to *name* in that class::

       class A:
           x = C()  # Automatically calls: x.__set_name__(A, 'x')

   If the class variable is assigned after the class is created,
   :meth:`__set_name__` will not be called automatically.
   If needed, :meth:`__set_name__` can be called directly::

       class A:
          pass

       c = C()
       A.x = c                  # The hook is not called
       c.__set_name__(A, 'x')   # Manually invoke the hook

   See :ref:`class-object-creation` for more details.

   .. versionadded:: 3.6


.. _metaclasses:

Metaclasses
^^^^^^^^^^^

.. index::
   single: metaclass
   pair: built-in function; type
   single: = (equals); class definition

By default, classes are constructed using :func:`type`. The class body is
executed in a new namespace and the class name is bound locally to the
result of ``type(name, bases, namespace)``.

The class creation process can be customized by passing the ``metaclass``
keyword argument in the class definition line, or by inheriting from an
existing class that included such an argument. In the following example,
both ``MyClass`` and ``MySubclass`` are instances of ``Meta``::

   class Meta(type):
       pass

   class MyClass(metaclass=Meta):
       pass

   class MySubclass(MyClass):
       pass

Any other keyword arguments that are specified in the class definition are
passed through to all metaclass operations described below.

When a class definition is executed, the following steps occur:

* MRO entries are resolved;
* the appropriate metaclass is determined;
* the class namespace is prepared;
* the class body is executed;
* the class object is created.


Resolving MRO entries
^^^^^^^^^^^^^^^^^^^^^

.. method:: object.__mro_entries__(self, bases)

   If a base that appears in a class definition is not an instance of
   :class:`type`, then an :meth:`!__mro_entries__` method is searched on the base.
   If an :meth:`!__mro_entries__` method is found, the base is substituted with the
   result of a call to :meth:`!__mro_entries__` when creating the class.
   The method is called with the original bases tuple
   passed to the *bases* parameter, and must return a tuple
   of classes that will be used instead of the base. The returned tuple may be
   empty: in these cases, the original base is ignored.

.. seealso::

   :func:`types.resolve_bases`
      Dynamically resolve bases that are not instances of :class:`type`.

   :func:`types.get_original_bases`
      Retrieve a class's "original bases" prior to modifications by
      :meth:`~object.__mro_entries__`.

   :pep:`560`
      Core support for typing module and generic types.


.. _metaclass-determination:

Determining the appropriate metaclass
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. index::
    single: metaclass hint

The appropriate metaclass for a class definition is determined as follows:

* if no bases and no explicit metaclass are given, then :func:`type` is used;
* if an explicit metaclass is given and it is *not* an instance of
  :func:`type`, then it is used directly as the metaclass;
* if an instance of :func:`type` is given as the explicit metaclass, or
  bases are defined, then the most derived metaclass is used.

The most derived metaclass is selected from the explicitly specified
metaclass (if any) and the metaclasses (i.e. ``type(cls)``) of all specified
base classes. The most derived metaclass is one which is a subtype of *all*
of these candidate metaclasses. If none of the candidate metaclasses meets
that criterion, then the class definition will fail with ``TypeError``.


.. _prepare:

Preparing the class namespace
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. index::
    single: __prepare__ (metaclass method)

Once the appropriate metaclass has been identified, then the class namespace
is prepared. If the metaclass has a ``__prepare__`` attribute, it is called
as ``namespace = metaclass.__prepare__(name, bases, **kwds)`` (where the
additional keyword arguments, if any, come from the class definition). The
``__prepare__`` method should be implemented as a
:func:`classmethod <classmethod>`. The
namespace returned by ``__prepare__`` is passed in to ``__new__``, but when
the final class object is created the namespace is copied into a new ``dict``.

If the metaclass has no ``__prepare__`` attribute, then the class namespace
is initialised as an empty ordered mapping.

.. seealso::

   :pep:`3115` - Metaclasses in Python 3000
      Introduced the ``__prepare__`` namespace hook


Executing the class body
^^^^^^^^^^^^^^^^^^^^^^^^

.. index::
    single: class; body

The class body is executed (approximately) as
``exec(body, globals(), namespace)``. The key difference from a normal
call to :func:`exec` is that lexical scoping allows the class body (including
any methods) to reference names from the current and outer scopes when the
class definition occurs inside a function.

However, even when the class definition occurs inside the function, methods
defined inside the class still cannot see names defined at the class scope.
Class variables must be accessed through the first parameter of instance or
class methods, or through the implicit lexically scoped ``__class__`` reference
described in the next section.

.. _class-object-creation:

Creating the class object
^^^^^^^^^^^^^^^^^^^^^^^^^

.. index::
    single: __class__ (method cell)
    single: __classcell__ (class namespace entry)


Once the class namespace has been populated by executing the class body,
the class object is created by calling
``metaclass(name, bases, namespace, **kwds)`` (the additional keywords
passed here are the same as those passed to ``__prepare__``).

This class object is the one that will be referenced by the zero-argument
form of :func:`super`. ``__class__`` is an implicit closure reference
created by the compiler if any methods in a class body refer to either
``__class__`` or ``super``. This allows the zero argument form of
:func:`super` to correctly identify the class being defined based on
lexical scoping, while the class or instance that was used to make the
current call is identified based on the first argument passed to the method.

.. impl-detail::

   In CPython 3.6 and later, the ``__class__`` cell is passed to the metaclass
   as a ``__classcell__`` entry in the class namespace. If present, this must
   be propagated up to the ``type.__new__`` call in order for the class to be
   initialised correctly.
   Failing to do so will result in a :exc:`RuntimeError` in Python 3.8.

When using the default metaclass :class:`type`, or any metaclass that ultimately
calls ``type.__new__``, the following additional customization steps are
invoked after creating the class object:

1) The ``type.__new__`` method collects all of the attributes in the class
   namespace that define a :meth:`~object.__set_name__` method;
2) Those ``__set_name__`` methods are called with the class
   being defined and the assigned name of that particular attribute;
3) The :meth:`~object.__init_subclass__` hook is called on the
   immediate parent of the new class in its method resolution order.

After the class object is created, it is passed to the class decorators
included in the class definition (if any) and the resulting object is bound
in the local namespace as the defined class.

When a new class is created by ``type.__new__``, the object provided as the
namespace parameter is copied to a new ordered mapping and the original
object is discarded. The new copy is wrapped in a read-only proxy, which
becomes the :attr:`~type.__dict__` attribute of the class object.

.. seealso::

   :pep:`3135` - New super
      Describes the implicit ``__class__`` closure reference


Uses for metaclasses
^^^^^^^^^^^^^^^^^^^^

The potential uses for metaclasses are boundless. Some ideas that have been
explored include enum, logging, interface checking, automatic delegation,
automatic property creation, proxies, frameworks, and automatic resource
locking/synchronization.


Customizing instance and subclass checks
----------------------------------------

The following methods are used to override the default behavior of the
:func:`isinstance` and :func:`issubclass` built-in functions.

In particular, the metaclass :class:`abc.ABCMeta` implements these methods in
order to allow the addition of Abstract Base Classes (ABCs) as "virtual base
classes" to any class or type (including built-in types), including other
ABCs.

.. method:: type.__instancecheck__(self, instance)

   Return true if *instance* should be considered a (direct or indirect)
   instance of *class*. If defined, called to implement ``isinstance(instance,
   class)``.


.. method:: type.__subclasscheck__(self, subclass)

   Return true if *subclass* should be considered a (direct or indirect)
   subclass of *class*.  If defined, called to implement ``issubclass(subclass,
   class)``.


Note that these methods are looked up on the type (metaclass) of a class.  They
cannot be defined as class methods in the actual class.  This is consistent with
the lookup of special methods that are called on instances, only in this
case the instance is itself a class.

.. seealso::

   :pep:`3119` - Introducing Abstract Base Classes
      Includes the specification for customizing :func:`isinstance` and
      :func:`issubclass` behavior through :meth:`~type.__instancecheck__` and
      :meth:`~type.__subclasscheck__`, with motivation for this functionality
      in the context of adding Abstract Base Classes (see the :mod:`abc`
      module) to the language.


Emulating generic types
-----------------------

When using :term:`type annotations<annotation>`, it is often useful to
*parameterize* a :term:`generic type` using Python's square-brackets notation.
For example, the annotation ``list[int]`` might be used to signify a
:class:`list` in which all the elements are of type :class:`int`.

.. seealso::

   :pep:`484` - Type Hints
      Introducing Python's framework for type annotations

   :ref:`Generic Alias Types<types-genericalias>`
      Documentation for objects representing parameterized generic classes

   :ref:`Generics`, :ref:`user-defined generics<user-defined-generics>` and :class:`typing.Generic`
      Documentation on how to implement generic classes that can be
      parameterized at runtime and understood by static type-checkers.

A class can *generally* only be parameterized if it defines the special
class method ``__class_getitem__()``.

.. classmethod:: object.__class_getitem__(cls, key)

   Return an object representing the specialization of a generic class
   by type arguments found in *key*.

   When defined on a class, ``__class_getitem__()`` is automatically a class
   method. As such, there is no need for it to be decorated with
   :deco:`classmethod` when it is defined.


The purpose of *__class_getitem__*
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The purpose of :meth:`~object.__class_getitem__` is to allow runtime
parameterization of standard-library generic classes in order to more easily
apply :term:`type hints<type hint>` to these classes.

To implement custom generic classes that can be parameterized at runtime and
understood by static type-checkers, users should either inherit from a standard
library class that already implements :meth:`~object.__class_getitem__`, or
inherit from :class:`typing.Generic`, which has its own implementation of
``__class_getitem__()``.

Custom implementations of :meth:`~object.__class_getitem__` on classes defined
outside of the standard library may not be understood by third-party
type-checkers such as mypy. Using ``__class_getitem__()`` on any class for
purposes other than type hinting is discouraged.


.. _classgetitem-versus-getitem:


*__class_getitem__* versus *__getitem__*
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Usually, the :ref:`subscription<subscriptions>` of an object using square
brackets will call the :meth:`~object.__getitem__` instance method defined on
the object's class. However, if the object being subscribed is itself a class,
the class method :meth:`~object.__class_getitem__` may be called instead.
``__class_getitem__()`` should return a :ref:`GenericAlias<types-genericalias>`
object if it is properly defined.

Presented with the :term:`expression` ``obj[x]``, the Python interpreter
follows something like the following process to decide whether
:meth:`~object.__getitem__` or :meth:`~object.__class_getitem__` should be
called::

   from inspect import isclass

   def subscribe(obj, x):
       """Return the result of the expression 'obj[x]'"""

       class_of_obj = type(obj)

       # If the class of obj defines __getitem__,
       # call class_of_obj.__getitem__(obj, x)
       if hasattr(class_of_obj, '__getitem__'):
           return class_of_obj.__getitem__(obj, x)

       # Else, if obj is a class and defines __class_getitem__,
       # call obj.__class_getitem__(x)
       elif isclass(obj) and hasattr(obj, '__class_getitem__'):
           return obj.__class_getitem__(x)

       # Else, raise an exception
       else:
           raise TypeError(
               f"'{class_of_obj.__name__}' object is not subscriptable"
           )

In Python, all classes are themselves instances of other classes. The class of
a class is known as that class's :term:`metaclass`, and most classes have the
:class:`type` class as their metaclass. :class:`type` does not define
:meth:`~object.__getitem__`, meaning that expressions such as ``list[int]``,
``dict[str, float]`` and ``tuple[str, bytes]`` all result in
:meth:`~object.__class_getitem__` being called::

   >>> # list has class "type" as its metaclass, like most classes:
   >>> type(list)
   <class 'type'>
   >>> type(dict) == type(list) == type(tuple) == type(str) == type(bytes)
   True
   >>> # "list[int]" calls "list.__class_getitem__(int)"
   >>> list[int]
   list[int]
   >>> # list.__class_getitem__ returns a GenericAlias object:
   >>> type(list[int])
   <class 'types.GenericAlias'>

However, if a class has a custom metaclass that defines
:meth:`~object.__getitem__`, subscribing the class may result in different
behaviour. An example of this can be found in the :mod:`enum` module::

   >>> from enum import Enum
   >>> class Menu(Enum):
   ...     """A breakfast menu"""
   ...     SPAM = 'spam'
   ...     BACON = 'bacon'
   ...
   >>> # Enum classes have a custom metaclass:
   >>> type(Menu)
   <class 'enum.EnumMeta'>
   >>> # EnumMeta defines __getitem__,
   >>> # so __class_getitem__ is not called,
   >>> # and the result is not a GenericAlias object:
   >>> Menu['SPAM']
   <Menu.SPAM: 'spam'>
   >>> type(Menu['SPAM'])
   <enum 'Menu'>


.. seealso::
   :pep:`560` - Core Support for typing module and generic types
      Introducing :meth:`~object.__class_getitem__`, and outlining when a
      :ref:`subscription<subscriptions>` results in ``__class_getitem__()``
      being called instead of :meth:`~object.__getitem__`


.. _callable-types:

Emulating callable objects
--------------------------


.. method:: object.__call__(self[, args...])

   .. index:: pair: call; instance

   Called when the instance is "called" as a function; if this method is defined,
   ``x(arg1, arg2, ...)`` roughly translates to ``type(x).__call__(x, arg1, ...)``.
   The :class:`object` class itself does not provide this method.


.. _sequence-types:

Emulating container types
-------------------------

The following methods can be defined to implement container objects. None of them
are provided by the :class:`object` class itself. Containers usually are
:term:`sequences <sequence>` (such as :class:`lists <list>` or
:class:`tuples <tuple>`) or :term:`mappings <mapping>` (like
:term:`dictionaries <dictionary>`),
but can represent other containers as well.  The first set of methods is used
either to emulate a sequence or to emulate a mapping; the difference is that for
a sequence, the allowable keys should be the integers *k* for which ``0 <= k <
N`` where *N* is the length of the sequence, or :class:`slice` objects, which define a
range of items.  It is also recommended that mappings provide the methods
:meth:`!keys`, :meth:`!values`, :meth:`!items`, :meth:`!get`, :meth:`!clear`,
:meth:`!setdefault`, :meth:`!pop`, :meth:`!popitem`, :meth:`!copy`, and
:meth:`!update` behaving similar to those for Python's standard :class:`dictionary <dict>`
objects.  The :mod:`collections.abc` module provides a
:class:`~collections.abc.MutableMapping`
:term:`abstract base class` to help create those methods from a base set of
:meth:`~object.__getitem__`, :meth:`~object.__setitem__`,
:meth:`~object.__delitem__`, and :meth:`!keys`.

Mutable sequences should provide methods
:meth:`~sequence.append`, :meth:`~sequence.clear`, :meth:`~sequence.count`,
:meth:`~sequence.extend`, :meth:`~sequence.index`, :meth:`~sequence.insert`,
:meth:`~sequence.pop`, :meth:`~sequence.remove`, and :meth:`~sequence.reverse`,
like Python standard :class:`list` objects.
Finally, sequence types should implement addition (meaning concatenation) and
multiplication (meaning repetition) by defining the methods
:meth:`~object.__add__`, :meth:`~object.__radd__`, :meth:`~object.__iadd__`,
:meth:`~object.__mul__`, :meth:`~object.__rmul__` and :meth:`~object.__imul__`
described below; they should not define other numerical
operators.

It is recommended that both mappings and sequences implement the
:meth:`~object.__contains__` method to allow efficient use of the ``in``
operator; for
mappings, ``in`` should search the mapping's keys; for sequences, it should
search through the values.  It is further recommended that both mappings and
sequences implement the :meth:`~object.__iter__` method to allow efficient iteration
through the container; for mappings, :meth:`!__iter__` should iterate
through the object's keys; for sequences, it should iterate through the values.

.. method:: object.__len__(self)

   .. index::
      pair: built-in function; len
      single: __bool__() (object method)

   Called to implement the built-in function :func:`len`.  Should return the length
   of the object, an integer ``>=`` 0.  Also, an object that doesn't define a
   :meth:`~object.__bool__` method and whose :meth:`!__len__` method returns zero is
   considered to be false in a Boolean context.

   .. impl-detail::

      In CPython, the length is required to be at most :data:`sys.maxsize`.
      If the length is larger than :data:`!sys.maxsize` some features (such as
      :func:`len`) may raise :exc:`OverflowError`.  To prevent raising
      :exc:`!OverflowError` by truth value testing, an object must define a
      :meth:`~object.__bool__` method.


.. method:: object.__length_hint__(self)

   Called to implement :func:`operator.length_hint`. Should return an estimated
   length for the object (which may be greater or less than the actual length).
   The length must be an integer ``>=`` 0. The return value may also be
   :data:`NotImplemented`, which is treated the same as if the
   ``__length_hint__`` method didn't exist at all. This method is purely an
   optimization and is never required for correctness.

   .. versionadded:: 3.4


.. index:: pair: object; slice

.. note::

   Slicing is done exclusively with the following three methods.  A call like ::

      a[1:2] = b

   is translated to ::

      a[slice(1, 2, None)] = b

   and so forth.  Missing slice items are always filled in with ``None``.


.. method:: object.__getitem__(self, key)

   Called to implement evaluation of ``self[key]``. For :term:`sequence` types,
   the accepted keys should be integers. Optionally, they may support
   :class:`slice` objects as well.  Negative index support is also optional.
   If *key* is
   of an inappropriate type, :exc:`TypeError` may be raised; if *key* is a value
   outside the set of indexes for the sequence (after any special
   interpretation of negative values), :exc:`IndexError` should be raised. For
   :term:`mapping` types, if *key* is missing (not in the container),
   :exc:`KeyError` should be raised.

   .. note::

      :keyword:`for` loops expect that an :exc:`IndexError` will be raised for
      illegal indexes to allow proper detection of the end of the sequence.

   .. note::

      When :ref:`subscripting<subscriptions>` a *class*, the special
      class method :meth:`~object.__class_getitem__` may be called instead of
      ``__getitem__()``. See :ref:`classgetitem-versus-getitem` for more
      details.


.. method:: object.__setitem__(self, key, value)

   Called to implement assignment to ``self[key]``.  Same note as for
   :meth:`__getitem__`.  This should only be implemented for mappings if the
   objects support changes to the values for keys, or if new keys can be added, or
   for sequences if elements can be replaced.  The same exceptions should be raised
   for improper *key* values as for the :meth:`__getitem__` method.


.. method:: object.__delitem__(self, key)

   Called to implement deletion of ``self[key]``.  Same note as for
   :meth:`__getitem__`.  This should only be implemented for mappings if the
   objects support removal of keys, or for sequences if elements can be removed
   from the sequence.  The same exceptions should be raised for improper *key*
   values as for the :meth:`__getitem__` method.


.. method:: object.__missing__(self, key)

   Called by :class:`dict`\ .\ :meth:`__getitem__` to implement ``self[key]`` for dict subclasses
   when key is not in the dictionary.


.. method:: object.__iter__(self)

   This method is called when an :term:`iterator` is required for a container.
   This method should return a new iterator object that can iterate over all the
   objects in the container.  For mappings, it should iterate over the keys of
   the container.


.. method:: object.__reversed__(self)

   Called (if present) by the :func:`reversed` built-in to implement
   reverse iteration.  It should return a new iterator object that iterates
   over all the objects in the container in reverse order.

   If the :meth:`__reversed__` method is not provided, the :func:`reversed`
   built-in will fall back to using the sequence protocol (:meth:`__len__` and
   :meth:`__getitem__`).  Objects that support the sequence protocol should
   only provide :meth:`__reversed__` if they can provide an implementation
   that is more efficient than the one provided by :func:`reversed`.


The membership test operators (:keyword:`in` and :keyword:`not in`) are normally
implemented as an iteration through a container. However, container objects can
supply the following special method with a more efficient implementation, which
also does not require the object be iterable.

.. method:: object.__contains__(self, item)

   Called to implement membership test operators.  Should return true if *item*
   is in *self*, false otherwise.  For mapping objects, this should consider the
   keys of the mapping rather than the values or the key-item pairs.

   For objects that don't define :meth:`__contains__`, the membership test first
   tries iteration via :meth:`__iter__`, then the old sequence iteration
   protocol via :meth:`__getitem__`, see :ref:`this section in the language
   reference <membership-test-details>`.


.. _numeric-types:

Emulating numeric types
-----------------------

The following methods can be defined to emulate numeric objects. Methods
corresponding to operations that are not supported by the particular kind of
number implemented (e.g., bitwise operations for non-integral numbers) should be
left undefined.


.. method:: object.__add__(self, other)
            object.__sub__(self, other)
            object.__mul__(self, other)
            object.__matmul__(self, other)
            object.__truediv__(self, other)
            object.__floordiv__(self, other)
            object.__mod__(self, other)
            object.__divmod__(self, other)
            object.__pow__(self, other[, modulo])
            object.__lshift__(self, other)
            object.__rshift__(self, other)
            object.__and__(self, other)
            object.__xor__(self, other)
            object.__or__(self, other)

   .. index::
      pair: built-in function; divmod
      pair: built-in function; pow
      pair: built-in function; pow

   These methods are called to implement the binary arithmetic operations
   (``+``, ``-``, ``*``, ``@``, ``/``, ``//``, ``%``, :func:`divmod`,
   :func:`pow`, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``).  For instance, to
   evaluate the expression ``x + y``, where *x* is an instance of a class that
   has an :meth:`__add__` method, ``type(x).__add__(x, y)`` is called.  The
   :meth:`__divmod__` method should be the equivalent to using
   :meth:`__floordiv__` and :meth:`__mod__`; it should not be related to
   :meth:`__truediv__`.  Note that :meth:`__pow__` should be defined to accept
   an optional third argument if the three-argument version of the built-in :func:`pow`
   function is to be supported.

   If one of those methods does not support the operation with the supplied
   arguments, it should return :data:`NotImplemented`.


.. method:: object.__radd__(self, other)
            object.__rsub__(self, other)
            object.__rmul__(self, other)
            object.__rmatmul__(self, other)
            object.__rtruediv__(self, other)
            object.__rfloordiv__(self, other)
            object.__rmod__(self, other)
            object.__rdivmod__(self, other)
            object.__rpow__(self, other[, modulo])
            object.__rlshift__(self, other)
            object.__rrshift__(self, other)
            object.__rand__(self, other)
            object.__rxor__(self, other)
            object.__ror__(self, other)

   .. index::
      pair: built-in function; divmod
      pair: built-in function; pow

   These methods are called to implement the binary arithmetic operations
   (``+``, ``-``, ``*``, ``@``, ``/``, ``//``, ``%``, :func:`divmod`,
   :func:`pow`, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``) with reflected
   (swapped) operands.  These functions are only called if the operands
   are of different types, when the left operand does not support the corresponding
   operation [#]_, or the right operand's class is derived from the left operand's
   class. [#]_ For instance, to evaluate the expression ``x - y``, where *y* is
   an instance of a class that has an :meth:`__rsub__` method, ``type(y).__rsub__(y, x)``
   is called if ``type(x).__sub__(x, y)`` returns :data:`NotImplemented` or ``type(y)``
   is a subclass of ``type(x)``. [#]_

   Note that :meth:`__rpow__` should be defined to accept an optional third
   argument if the three-argument version of the built-in :func:`pow` function
   is to be supported.

   .. versionchanged:: 3.14

      Three-argument :func:`pow` now try calling :meth:`~object.__rpow__` if necessary.
      Previously it was only called in two-argument :func:`!pow` and the binary
      power operator.

   .. note::

      If the right operand's type is a subclass of the left operand's type and
      that subclass provides a different implementation of the reflected method
      for the operation, this method will be called before the left operand's
      non-reflected method. This behavior allows subclasses to override their
      ancestors' operations.

.. method:: object.__iadd__(self, other)
            object.__isub__(self, other)
            object.__imul__(self, other)
            object.__imatmul__(self, other)
            object.__itruediv__(self, other)
            object.__ifloordiv__(self, other)
            object.__imod__(self, other)
            object.__ipow__(self, other[, modulo])
            object.__ilshift__(self, other)
            object.__irshift__(self, other)
            object.__iand__(self, other)
            object.__ixor__(self, other)
            object.__ior__(self, other)

   These methods are called to implement the augmented arithmetic assignments
   (``+=``, ``-=``, ``*=``, ``@=``, ``/=``, ``//=``, ``%=``, ``**=``, ``<<=``,
   ``>>=``, ``&=``, ``^=``, ``|=``).  These methods should attempt to do the
   operation in-place (modifying *self*) and return the result (which could be,
   but does not have to be, *self*).  If a specific method is not defined, or if
   that method returns :data:`NotImplemented`, the
   augmented assignment falls back to the normal methods.  For instance, if *x*
   is an instance of a class with an :meth:`__iadd__` method, ``x += y`` is
   equivalent to ``x = x.__iadd__(y)`` . If :meth:`__iadd__` does not exist, or if ``x.__iadd__(y)``
   returns :data:`!NotImplemented`, ``x.__add__(y)`` and
   ``y.__radd__(x)`` are considered, as with the evaluation of ``x + y``. In
   certain situations, augmented assignment can result in unexpected errors (see
   :ref:`faq-augmented-assignment-tuple-error`), but this behavior is in fact
   part of the data model.


.. method:: object.__neg__(self)
            object.__pos__(self)
            object.__abs__(self)
            object.__invert__(self)

   .. index:: pair: built-in function; abs

   Called to implement the unary arithmetic operations (``-``, ``+``, :func:`abs`
   and ``~``).


.. method:: object.__complex__(self)
            object.__int__(self)
            object.__float__(self)

   .. index::
      pair: built-in function; complex
      pair: built-in function; int
      pair: built-in function; float

   Called to implement the built-in functions :func:`complex`,
   :func:`int` and :func:`float`.  Should return a value
   of the appropriate type.


.. method:: object.__index__(self)

   Called to implement :func:`operator.index`, and whenever Python needs to
   losslessly convert the numeric object to an integer object (such as in
   slicing, or in the built-in :func:`bin`, :func:`hex` and :func:`oct`
   functions). Presence of this method indicates that the numeric object is
   an integer type.  Must return an integer.

   If :meth:`__int__`, :meth:`__float__` and :meth:`__complex__` are not
   defined then corresponding built-in functions :func:`int`, :func:`float`
   and :func:`complex` fall back to :meth:`__index__`.


.. method:: object.__round__(self, [,ndigits])
            object.__trunc__(self)
            object.__floor__(self)
            object.__ceil__(self)

   .. index:: pair: built-in function; round

   Called to implement the built-in function :func:`round` and :mod:`math`
   functions :func:`~math.trunc`, :func:`~math.floor` and :func:`~math.ceil`.
   Unless *ndigits* is passed to :meth:`!__round__` all these methods should
   return the value of the object truncated to an :class:`~numbers.Integral`
   (typically an :class:`int`).

   .. versionchanged:: 3.14
      :func:`int` no longer delegates to the :meth:`~object.__trunc__` method.


.. _context-managers:

With Statement Context Managers
-------------------------------

A :dfn:`context manager` is an object that defines the runtime context to be
established when executing a :keyword:`with` statement. The context manager
handles the entry into, and the exit from, the desired runtime context for the
execution of the block of code.  Context managers are normally invoked using the
:keyword:`!with` statement (described in section :ref:`with`), but can also be
used by directly invoking their methods.

.. index::
   pair: statement; with
   single: context manager

Typical uses of context managers include saving and restoring various kinds of
global state, locking and unlocking resources, closing opened files, etc.

For more information on context managers, see :ref:`typecontextmanager`.
The :class:`object` class itself does not provide the context manager methods.


.. method:: object.__enter__(self)

   Enter the runtime context related to this object. The :keyword:`with` statement
   will bind this method's return value to the target(s) specified in the
   :keyword:`!as` clause of the statement, if any.


.. method:: object.__exit__(self, exc_type, exc_value, traceback)

   Exit the runtime context related to this object. The parameters describe the
   exception that caused the context to be exited. If the context was exited
   without an exception, all three arguments will be :const:`None`.

   If an exception is supplied, and the method wishes to suppress the exception
   (i.e., prevent it from being propagated), it should return a true value.
   Otherwise, the exception will be processed normally upon exit from this method.

   Note that :meth:`~object.__exit__` methods should not reraise the passed-in exception;
   this is the caller's responsibility.


.. seealso::

   :pep:`343` - The "with" statement
      The specification, background, and examples for the Python :keyword:`with`
      statement.


.. _class-pattern-matching:

Customizing positional arguments in class pattern matching
----------------------------------------------------------

When using a class name in a pattern, positional arguments in the pattern are not
allowed by default, i.e. ``case MyClass(x, y)`` is typically invalid without special
support in ``MyClass``. To be able to use that kind of pattern, the class needs to
define a *__match_args__* attribute.

.. data:: object.__match_args__

   This class variable can be assigned a tuple of strings. When this class is
   used in a class pattern with positional arguments, each positional argument will
   be converted into a keyword argument, using the corresponding value in
   *__match_args__* as the keyword. The absence of this attribute is equivalent to
   setting it to ``()``.

For example, if ``MyClass.__match_args__`` is ``("left", "center", "right")`` that means
that ``case MyClass(x, y)`` is equivalent to ``case MyClass(left=x, center=y)``. Note
that the number of arguments in the pattern must be smaller than or equal to the number
of elements in *__match_args__*; if it is larger, the pattern match attempt will raise
a :exc:`TypeError`.

.. versionadded:: 3.10

.. seealso::

   :pep:`634` - Structural Pattern Matching
      The specification for the Python ``match`` statement.


.. _python-buffer-protocol:

Emulating buffer types
----------------------

The :ref:`buffer protocol <bufferobjects>` provides a way for Python
objects to expose efficient access to a low-level memory array. This protocol
is implemented by builtin types such as :class:`bytes` and :class:`memoryview`,
and third-party libraries may define additional buffer types.

While buffer types are usually implemented in C, it is also possible to
implement the protocol in Python.

.. method:: object.__buffer__(self, flags)

   Called when a buffer is requested from *self* (for example, by the
   :class:`memoryview` constructor). The *flags* argument is an integer
   representing the kind of buffer requested, affecting for example whether
   the returned buffer is read-only or writable. :class:`inspect.BufferFlags`
   provides a convenient way to interpret the flags. The method must return
   a :class:`memoryview` object.

.. method:: object.__release_buffer__(self, buffer)

   Called when a buffer is no longer needed. The *buffer* argument is a
   :class:`memoryview` object that was previously returned by
   :meth:`~object.__buffer__`. The method must release any resources associated
   with the buffer. This method should return ``None``.
   Buffer objects that do not need to perform any cleanup are not required
   to implement this method.

.. versionadded:: 3.12

.. seealso::

   :pep:`688` - Making the buffer protocol accessible in Python
      Introduces the Python ``__buffer__`` and ``__release_buffer__`` methods.

   :class:`collections.abc.Buffer`
      ABC for buffer types.

Annotations
-----------

Functions, classes, and modules may contain :term:`annotations <annotation>`,
which are a way to associate information (usually :term:`type hints <type hint>`)
with a symbol.

.. attribute:: object.__annotations__

   This attribute contains the annotations for an object. It is
   :ref:`lazily evaluated <lazy-evaluation>`, so accessing the attribute may
   execute arbitrary code and raise exceptions. If evaluation is successful, the
   attribute is set to a dictionary mapping from variable names to annotations.

   .. versionchanged:: 3.14
      Annotations are now lazily evaluated.

.. method:: object.__annotate__(format)

   An :term:`annotate function`.
   Returns a new dictionary object mapping attribute/parameter names to their annotation values.

   Takes a format parameter specifying the format in which annotations values should be provided.
   It must be a member of the :class:`annotationlib.Format` enum, or an integer with
   a value corresponding to a member of the enum.

   If an annotate function doesn't support the requested format, it must raise
   :exc:`NotImplementedError`. Annotate functions must always support
   :attr:`~annotationlib.Format.VALUE` format; they must not raise
   :exc:`NotImplementedError()` when called with this format.

   When called with  :attr:`~annotationlib.Format.VALUE` format, an annotate function may raise
   :exc:`NameError`; it must not raise :exc:`!NameError` when called requesting any other format.

   If an object does not have any annotations, :attr:`~object.__annotate__` should preferably be set
   to ``None`` (it can’t be deleted), rather than set to a function that returns an empty dict.

   .. versionadded:: 3.14

.. seealso::

   :pep:`649` --- Deferred evaluation of annotation using descriptors
      Introduces lazy evaluation of annotations and the ``__annotate__`` function.


.. _special-lookup:

Special method lookup
---------------------

For custom classes, implicit invocations of special methods are only guaranteed
to work correctly if defined on an object's type, not in the object's instance
dictionary.  That behaviour is the reason why the following code raises an
exception::

   >>> class C:
   ...     pass
   ...
   >>> c = C()
   >>> c.__len__ = lambda: 5
   >>> len(c)
   Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
   TypeError: object of type 'C' has no len()

The rationale behind this behaviour lies with a number of special methods such
as :meth:`~object.__hash__` and :meth:`~object.__repr__` that are implemented
by all objects,
including type objects. If the implicit lookup of these methods used the
conventional lookup process, they would fail when invoked on the type object
itself::

   >>> 1 .__hash__() == hash(1)
   True
   >>> int.__hash__() == hash(int)
   Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
   TypeError: descriptor '__hash__' of 'int' object needs an argument

Incorrectly attempting to invoke an unbound method of a class in this way is
sometimes referred to as 'metaclass confusion', and is avoided by bypassing
the instance when looking up special methods::

   >>> type(1).__hash__(1) == hash(1)
   True
   >>> type(int).__hash__(int) == hash(int)
   True

In addition to bypassing any instance attributes in the interest of
correctness, implicit special method lookup generally also bypasses the
:meth:`~object.__getattribute__` method even of the object's metaclass::

   >>> class Meta(type):
   ...     def __getattribute__(*args):
   ...         print("Metaclass getattribute invoked")
   ...         return type.__getattribute__(*args)
   ...
   >>> class C(object, metaclass=Meta):
   ...     def __len__(self):
   ...         return 10
   ...     def __getattribute__(*args):
   ...         print("Class getattribute invoked")
   ...         return object.__getattribute__(*args)
   ...
   >>> c = C()
   >>> c.__len__()                 # Explicit lookup via instance
   Class getattribute invoked
   10
   >>> type(c).__len__(c)          # Explicit lookup via type
   Metaclass getattribute invoked
   10
   >>> len(c)                      # Implicit lookup
   10

Bypassing the :meth:`~object.__getattribute__` machinery in this fashion
provides significant scope for speed optimisations within the
interpreter, at the cost of some flexibility in the handling of
special methods (the special method *must* be set on the class
object itself in order to be consistently invoked by the interpreter).


.. index::
   single: coroutine

Coroutines
==========


Awaitable Objects
-----------------

An :term:`awaitable` object generally implements an :meth:`~object.__await__` method.
:term:`Coroutine objects <coroutine>` returned from :keyword:`async def` functions
are awaitable.

.. note::

   The :term:`generator iterator` objects returned from generators
   decorated with :func:`types.coroutine`
   are also awaitable, but they do not implement :meth:`~object.__await__`.

.. method:: object.__await__(self)

   Must return an :term:`iterator`.  Should be used to implement
   :term:`awaitable` objects.  For instance, :class:`asyncio.Future` implements
   this method to be compatible with the :keyword:`await` expression.
   The :class:`object` class itself is not awaitable and does not provide
   this method.

   .. note::

      The language doesn't place any restriction on the type or value of the
      objects yielded by the iterator returned by ``__await__``, as this is
      specific to the implementation of the asynchronous execution framework
      (e.g. :mod:`asyncio`) that will be managing the :term:`awaitable` object.


.. versionadded:: 3.5

.. seealso:: :pep:`492` for additional information about awaitable objects.


.. _coroutine-objects:

Coroutine Objects
-----------------

:term:`Coroutine objects <coroutine>` are :term:`awaitable` objects.
A coroutine's execution can be controlled by calling :meth:`~object.__await__` and
iterating over the result.  When the coroutine has finished executing and
returns, the iterator raises :exc:`StopIteration`, and the exception's
:attr:`~StopIteration.value` attribute holds the return value.  If the
coroutine raises an exception, it is propagated by the iterator.  Coroutines
should not directly raise unhandled :exc:`StopIteration` exceptions.

Coroutines also have the methods listed below, which are analogous to
those of generators (see :ref:`generator-methods`).  However, unlike
generators, coroutines do not directly support iteration.

.. versionchanged:: 3.5.2
   It is a :exc:`RuntimeError` to await on a coroutine more than once.


.. method:: coroutine.send(value)

   Starts or resumes execution of the coroutine.  If *value* is ``None``,
   this is equivalent to advancing the iterator returned by
   :meth:`~object.__await__`.  If *value* is not ``None``, this method delegates
   to the :meth:`~generator.send` method of the iterator that caused
   the coroutine to suspend.  The result (return value,
   :exc:`StopIteration`, or other exception) is the same as when
   iterating over the :meth:`!__await__` return value, described above.

.. method:: coroutine.throw(value)
            coroutine.throw(type[, value[, traceback]])

   Raises the specified exception in the coroutine.  This method delegates
   to the :meth:`~generator.throw` method of the iterator that caused
   the coroutine to suspend, if it has such a method.  Otherwise,
   the exception is raised at the suspension point.  The result
   (return value, :exc:`StopIteration`, or other exception) is the same as
   when iterating over the :meth:`~object.__await__` return value, described
   above.  If the exception is not caught in the coroutine, it propagates
   back to the caller.

   .. versionchanged:: 3.12

      The second signature \(type\[, value\[, traceback\]\]\) is deprecated and
      may be removed in a future version of Python.

.. method:: coroutine.close()

   Causes the coroutine to clean itself up and exit.  If the coroutine
   is suspended, this method first delegates to the :meth:`~generator.close`
   method of the iterator that caused the coroutine to suspend, if it
   has such a method.  Then it raises :exc:`GeneratorExit` at the
   suspension point, causing the coroutine to immediately clean itself up.
   Finally, the coroutine is marked as having finished executing, even if
   it was never started.

   Coroutine objects are automatically closed using the above process when
   they are about to be destroyed.

.. _async-iterators:

Asynchronous Iterators
----------------------

An *asynchronous iterator* can call asynchronous code in
its ``__anext__`` method.

Asynchronous iterators can be used in an :keyword:`async for` statement.

The :class:`object` class itself does not provide these methods.


.. method:: object.__aiter__(self)

   Must return an *asynchronous iterator* object.

.. method:: object.__anext__(self)

   Must return an *awaitable* resulting in a next value of the iterator.  Should
   raise a :exc:`StopAsyncIteration` error when the iteration is over.

An example of an asynchronous iterable object::

    class Reader:
        async def readline(self):
            ...

        def __aiter__(self):
            return self

        async def __anext__(self):
            val = await self.readline()
            if val == b'':
                raise StopAsyncIteration
            return val

.. versionadded:: 3.5

.. versionchanged:: 3.7
   Prior to Python 3.7, :meth:`~object.__aiter__` could return an *awaitable*
   that would resolve to an
   :term:`asynchronous iterator <asynchronous iterator>`.

   Starting with Python 3.7, :meth:`~object.__aiter__` must return an
   asynchronous iterator object.  Returning anything else
   will result in a :exc:`TypeError` error.


.. _async-context-managers:

Asynchronous Context Managers
-----------------------------

An *asynchronous context manager* is a *context manager* that is able to
suspend execution in its ``__aenter__`` and ``__aexit__`` methods.

Asynchronous context managers can be used in an :keyword:`async with` statement.

The :class:`object` class itself does not provide these methods.

.. method:: object.__aenter__(self)

   Semantically similar to :meth:`~object.__enter__`, the only
   difference being that it must return an *awaitable*.

.. method:: object.__aexit__(self, exc_type, exc_value, traceback)

   Semantically similar to :meth:`~object.__exit__`, the only
   difference being that it must return an *awaitable*.

An example of an asynchronous context manager class::

    class AsyncContextManager:
        async def __aenter__(self):
            await log('entering context')

        async def __aexit__(self, exc_type, exc, tb):
            await log('exiting context')

.. versionadded:: 3.5


.. rubric:: Footnotes

.. [#] It *is* possible in some cases to change an object's type, under certain
   controlled conditions. It generally isn't a good idea though, since it can
   lead to some very strange behaviour if it is handled incorrectly.

.. [#] The :meth:`~object.__hash__`, :meth:`~object.__iter__`,
   :meth:`~object.__reversed__`, :meth:`~object.__contains__`,
   :meth:`~object.__class_getitem__` and :meth:`~os.PathLike.__fspath__`
   methods have special handling for this. Others
   will still raise a :exc:`TypeError`, but may do so by relying on
   the behavior that ``None`` is not callable.

.. [#] "Does not support" here means that the class has no such method, or
   the method returns :data:`NotImplemented`.  Do not set the method to
   ``None`` if you want to force fallback to the right operand's reflected
   method—that will instead have the opposite effect of explicitly
   *blocking* such fallback.

.. [#] For operands of the same type, it is assumed that if the non-reflected method
   (such as :meth:`~object.__add__`) fails then the operation is not supported, which is why the
   reflected method is not called.

.. [#] If the right operand's type is a subclass of the left operand's type, the
   reflected method having precedence allows subclasses to override their ancestors'
   operations.
