gh-101100: Add a table of class attributes to the "Custom classes" section of the data model docs (#124480)

This commit is contained in:
Alex Waygood 2024-09-25 12:29:58 -07:00 committed by GitHub
parent 6318ffcba2
commit 0d9d56c4e4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
41 changed files with 273 additions and 226 deletions

View File

@ -733,7 +733,7 @@ Exception Classes
This creates a class object derived from :exc:`Exception` (accessible in C as This creates a class object derived from :exc:`Exception` (accessible in C as
:c:data:`PyExc_Exception`). :c:data:`PyExc_Exception`).
The :attr:`!__module__` attribute of the new class is set to the first part (up The :attr:`~type.__module__` attribute of the new class is set to the first part (up
to the last dot) of the *name* argument, and the class name is set to the last to the last dot) of the *name* argument, and the class name is set to the last
part (after the last dot). The *base* argument can be used to specify alternate part (after the last dot). The *base* argument can be used to specify alternate
base classes; it can either be only one class or a tuple of classes. The *dict* base classes; it can either be only one class or a tuple of classes. The *dict*

View File

@ -367,14 +367,14 @@ Object Protocol
The result will be ``1`` when at least one of the checks returns ``1``, The result will be ``1`` when at least one of the checks returns ``1``,
otherwise it will be ``0``. otherwise it will be ``0``.
If *cls* has a :meth:`~class.__subclasscheck__` method, it will be called to If *cls* has a :meth:`~type.__subclasscheck__` method, it will be called to
determine the subclass status as described in :pep:`3119`. Otherwise, determine the subclass status as described in :pep:`3119`. Otherwise,
*derived* is a subclass of *cls* if it is a direct or indirect subclass, *derived* is a subclass of *cls* if it is a direct or indirect subclass,
i.e. contained in ``cls.__mro__``. i.e. contained in :attr:`cls.__mro__ <type.__mro__>`.
Normally only class objects, i.e. instances of :class:`type` or a derived Normally only class objects, i.e. instances of :class:`type` or a derived
class, are considered classes. However, objects can override this by having class, are considered classes. However, objects can override this by having
a :attr:`~class.__bases__` attribute (which must be a tuple of base classes). a :attr:`~type.__bases__` attribute (which must be a tuple of base classes).
.. c:function:: int PyObject_IsInstance(PyObject *inst, PyObject *cls) .. c:function:: int PyObject_IsInstance(PyObject *inst, PyObject *cls)
@ -386,15 +386,15 @@ Object Protocol
The result will be ``1`` when at least one of the checks returns ``1``, The result will be ``1`` when at least one of the checks returns ``1``,
otherwise it will be ``0``. otherwise it will be ``0``.
If *cls* has a :meth:`~class.__instancecheck__` method, it will be called to If *cls* has a :meth:`~type.__instancecheck__` method, it will be called to
determine the subclass status as described in :pep:`3119`. Otherwise, *inst* determine the subclass status as described in :pep:`3119`. Otherwise, *inst*
is an instance of *cls* if its class is a subclass of *cls*. is an instance of *cls* if its class is a subclass of *cls*.
An instance *inst* can override what is considered its class by having a An instance *inst* can override what is considered its class by having a
:attr:`~instance.__class__` attribute. :attr:`~object.__class__` attribute.
An object *cls* can override if it is considered a class, and what its base An object *cls* can override if it is considered a class, and what its base
classes are, by having a :attr:`~class.__bases__` attribute (which must be a tuple classes are, by having a :attr:`~type.__bases__` attribute (which must be a tuple
of base classes). of base classes).

View File

@ -53,7 +53,8 @@ Type Objects
.. c:function:: PyObject* PyType_GetDict(PyTypeObject* type) .. c:function:: PyObject* PyType_GetDict(PyTypeObject* type)
Return the type object's internal namespace, which is otherwise only Return the type object's internal namespace, which is otherwise only
exposed via a read-only proxy (``cls.__dict__``). This is a exposed via a read-only proxy (:attr:`cls.__dict__ <type.__dict__>`).
This is a
replacement for accessing :c:member:`~PyTypeObject.tp_dict` directly. replacement for accessing :c:member:`~PyTypeObject.tp_dict` directly.
The returned dictionary must be treated as read-only. The returned dictionary must be treated as read-only.
@ -140,7 +141,7 @@ Type Objects
Return true if *a* is a subtype of *b*. Return true if *a* is a subtype of *b*.
This function only checks for actual subtypes, which means that This function only checks for actual subtypes, which means that
:meth:`~class.__subclasscheck__` is not called on *b*. Call :meth:`~type.__subclasscheck__` is not called on *b*. Call
:c:func:`PyObject_IsSubclass` to do the same check that :func:`issubclass` :c:func:`PyObject_IsSubclass` to do the same check that :func:`issubclass`
would do. would do.
@ -174,29 +175,30 @@ Type Objects
.. c:function:: PyObject* PyType_GetName(PyTypeObject *type) .. c:function:: PyObject* PyType_GetName(PyTypeObject *type)
Return the type's name. Equivalent to getting the type's ``__name__`` attribute. Return the type's name. Equivalent to getting the type's
:attr:`~type.__name__` attribute.
.. versionadded:: 3.11 .. versionadded:: 3.11
.. c:function:: PyObject* PyType_GetQualName(PyTypeObject *type) .. c:function:: PyObject* PyType_GetQualName(PyTypeObject *type)
Return the type's qualified name. Equivalent to getting the Return the type's qualified name. Equivalent to getting the
type's ``__qualname__`` attribute. type's :attr:`~type.__qualname__` attribute.
.. versionadded:: 3.11 .. versionadded:: 3.11
.. c:function:: PyObject* PyType_GetFullyQualifiedName(PyTypeObject *type) .. c:function:: PyObject* PyType_GetFullyQualifiedName(PyTypeObject *type)
Return the type's fully qualified name. Equivalent to Return the type's fully qualified name. Equivalent to
``f"{type.__module__}.{type.__qualname__}"``, or ``type.__qualname__`` if ``f"{type.__module__}.{type.__qualname__}"``, or :attr:`type.__qualname__`
``type.__module__`` is not a string or is equal to ``"builtins"``. if :attr:`type.__module__` is not a string or is equal to ``"builtins"``.
.. versionadded:: 3.13 .. versionadded:: 3.13
.. c:function:: PyObject* PyType_GetModuleName(PyTypeObject *type) .. c:function:: PyObject* PyType_GetModuleName(PyTypeObject *type)
Return the type's module name. Equivalent to getting the ``type.__module__`` Return the type's module name. Equivalent to getting the
attribute. :attr:`type.__module__` attribute.
.. versionadded:: 3.13 .. versionadded:: 3.13

View File

@ -567,12 +567,12 @@ and :c:data:`PyType_Type` effectively act as defaults.)
For :ref:`statically allocated type objects <static-types>`, For :ref:`statically allocated type objects <static-types>`,
the *tp_name* field should contain a dot. the *tp_name* field should contain a dot.
Everything before the last dot is made accessible as the :attr:`__module__` Everything before the last dot is made accessible as the :attr:`~type.__module__`
attribute, and everything after the last dot is made accessible as the attribute, and everything after the last dot is made accessible as the
:attr:`~definition.__name__` attribute. :attr:`~type.__name__` attribute.
If no dot is present, the entire :c:member:`~PyTypeObject.tp_name` field is made accessible as the If no dot is present, the entire :c:member:`~PyTypeObject.tp_name` field is made accessible as the
:attr:`~definition.__name__` attribute, and the :attr:`__module__` attribute is undefined :attr:`~type.__name__` attribute, and the :attr:`~type.__module__` attribute is undefined
(unless explicitly set in the dictionary, as explained above). This means your (unless explicitly set in the dictionary, as explained above). This means your
type will be impossible to pickle. Additionally, it will not be listed in type will be impossible to pickle. Additionally, it will not be listed in
module documentations created with pydoc. module documentations created with pydoc.
@ -1131,7 +1131,7 @@ and :c:data:`PyType_Type` effectively act as defaults.)
.. c:macro:: Py_TPFLAGS_MANAGED_DICT .. c:macro:: Py_TPFLAGS_MANAGED_DICT
This bit indicates that instances of the class have a ``__dict__`` This bit indicates that instances of the class have a `~object.__dict__`
attribute, and that the space for the dictionary is managed by the VM. attribute, and that the space for the dictionary is managed by the VM.
If this flag is set, :c:macro:`Py_TPFLAGS_HAVE_GC` should also be set. If this flag is set, :c:macro:`Py_TPFLAGS_HAVE_GC` should also be set.
@ -1335,8 +1335,8 @@ and :c:data:`PyType_Type` effectively act as defaults.)
.. c:member:: const char* PyTypeObject.tp_doc .. c:member:: const char* PyTypeObject.tp_doc
An optional pointer to a NUL-terminated C string giving the docstring for this An optional pointer to a NUL-terminated C string giving the docstring for this
type object. This is exposed as the :attr:`__doc__` attribute on the type and type object. This is exposed as the :attr:`~type.__doc__` attribute on the
instances of the type. type and instances of the type.
**Inheritance:** **Inheritance:**
@ -2036,7 +2036,7 @@ and :c:data:`PyType_Type` effectively act as defaults.)
A collection of subclasses. Internal use only. May be an invalid pointer. A collection of subclasses. Internal use only. May be an invalid pointer.
To get a list of subclasses, call the Python method To get a list of subclasses, call the Python method
:py:meth:`~class.__subclasses__`. :py:meth:`~type.__subclasses__`.
.. versionchanged:: 3.12 .. versionchanged:: 3.12

View File

@ -296,7 +296,7 @@ An interesting advantage of using the :c:member:`~PyTypeObject.tp_members` table
descriptors that are used at runtime is that any attribute defined this way can descriptors that are used at runtime is that any attribute defined this way can
have an associated doc string simply by providing the text in the table. An have an associated doc string simply by providing the text in the table. An
application can use the introspection API to retrieve the descriptor from the application can use the introspection API to retrieve the descriptor from the
class object, and get the doc string using its :attr:`!__doc__` attribute. class object, and get the doc string using its :attr:`~type.__doc__` attribute.
As with the :c:member:`~PyTypeObject.tp_methods` table, a sentinel entry with a :c:member:`~PyMethodDef.ml_name` value As with the :c:member:`~PyTypeObject.tp_methods` table, a sentinel entry with a :c:member:`~PyMethodDef.ml_name` value
of ``NULL`` is required. of ``NULL`` is required.

View File

@ -144,7 +144,7 @@ only used for variable-sized objects and should otherwise be zero.
If you want your type to be subclassable from Python, and your type has the same If you want your type to be subclassable from Python, and your type has the same
:c:member:`~PyTypeObject.tp_basicsize` as its base type, you may have problems with multiple :c:member:`~PyTypeObject.tp_basicsize` as its base type, you may have problems with multiple
inheritance. A Python subclass of your type will have to list your type first inheritance. A Python subclass of your type will have to list your type first
in its :attr:`~class.__bases__`, or else it will not be able to call your type's in its :attr:`~type.__bases__`, or else it will not be able to call your type's
:meth:`~object.__new__` method without getting an error. You can avoid this problem by :meth:`~object.__new__` method without getting an error. You can avoid this problem by
ensuring that your type has a larger value for :c:member:`~PyTypeObject.tp_basicsize` than its ensuring that your type has a larger value for :c:member:`~PyTypeObject.tp_basicsize` than its
base type does. Most of the time, this will be true anyway, because either your base type does. Most of the time, this will be true anyway, because either your

View File

@ -1614,7 +1614,7 @@ method too, and it must do so carefully. The basic implementation of
... ...
Most :meth:`!__setattr__` implementations must modify Most :meth:`!__setattr__` implementations must modify
:meth:`self.__dict__ <object.__dict__>` to store :attr:`self.__dict__ <object.__dict__>` to store
local state for self without causing an infinite recursion. local state for self without causing an infinite recursion.

View File

@ -347,7 +347,7 @@ Glossary
docstring docstring
A string literal which appears as the first expression in a class, A string literal which appears as the first expression in a class,
function or module. While ignored when the suite is executed, it is function or module. While ignored when the suite is executed, it is
recognized by the compiler and put into the :attr:`!__doc__` attribute recognized by the compiler and put into the :attr:`~definition.__doc__` attribute
of the enclosing class, function or module. Since it is available via of the enclosing class, function or module. Since it is available via
introspection, it is the canonical place for documentation of the introspection, it is the canonical place for documentation of the
object. object.
@ -1241,7 +1241,7 @@ Glossary
type type
The type of a Python object determines what kind of object it is; every The type of a Python object determines what kind of object it is; every
object has a type. An object's type is accessible as its object has a type. An object's type is accessible as its
:attr:`~instance.__class__` attribute or can be retrieved with :attr:`~object.__class__` attribute or can be retrieved with
``type(obj)``. ``type(obj)``.
type alias type alias

View File

@ -107,9 +107,9 @@ Your code will have to have a separate code path if the object
you're examining is a class (``isinstance(o, type)``). you're examining is a class (``isinstance(o, type)``).
In that case, best practice relies on an implementation detail In that case, best practice relies on an implementation detail
of Python 3.9 and before: if a class has annotations defined, of Python 3.9 and before: if a class has annotations defined,
they are stored in the class's ``__dict__`` dictionary. Since they are stored in the class's :attr:`~type.__dict__` dictionary. Since
the class may or may not have annotations defined, best practice the class may or may not have annotations defined, best practice
is to call the ``get`` method on the class dict. is to call the :meth:`~dict.get` method on the class dict.
To put it all together, here is some sample code that safely To put it all together, here is some sample code that safely
accesses the ``__annotations__`` attribute on an arbitrary accesses the ``__annotations__`` attribute on an arbitrary
@ -126,8 +126,8 @@ the type of ``ann`` using :func:`isinstance` before further
examination. examination.
Note that some exotic or malformed type objects may not have Note that some exotic or malformed type objects may not have
a ``__dict__`` attribute, so for extra safety you may also wish a :attr:`~type.__dict__` attribute, so for extra safety you may also wish
to use :func:`getattr` to access ``__dict__``. to use :func:`getattr` to access :attr:`!__dict__`.
Manually Un-Stringizing Stringized Annotations Manually Un-Stringizing Stringized Annotations
@ -247,4 +247,5 @@ on the class, you may observe unexpected behavior; see
quirks by using :func:`annotationlib.get_annotations` on Python 3.14+ or quirks by using :func:`annotationlib.get_annotations` on Python 3.14+ or
:func:`inspect.get_annotations` on Python 3.10+. On earlier versions of :func:`inspect.get_annotations` on Python 3.10+. On earlier versions of
Python, you can avoid these bugs by accessing the annotations from the Python, you can avoid these bugs by accessing the annotations from the
class's ``__dict__`` (e.g., ``cls.__dict__.get('__annotations__', None)``). class's :attr:`~type.__dict__`
(e.g., ``cls.__dict__.get('__annotations__', None)``).

View File

@ -562,8 +562,8 @@ attribute access.
The expression ``obj.x`` looks up the attribute ``x`` in the chain of The expression ``obj.x`` looks up the attribute ``x`` in the chain of
namespaces for ``obj``. If the search finds a descriptor outside of the namespaces for ``obj``. If the search finds a descriptor outside of the
instance ``__dict__``, its :meth:`__get__` method is invoked according to the instance :attr:`~object.__dict__`, its :meth:`~object.__get__` method is
precedence rules listed below. invoked according to the precedence rules listed below.
The details of invocation depend on whether ``obj`` is an object, class, or The details of invocation depend on whether ``obj`` is an object, class, or
instance of super. instance of super.

View File

@ -608,7 +608,7 @@ The solution is to specify the module name explicitly as follows::
the source, pickling will be disabled. the source, pickling will be disabled.
The new pickle protocol 4 also, in some circumstances, relies on The new pickle protocol 4 also, in some circumstances, relies on
:attr:`~definition.__qualname__` being set to the location where pickle will be able :attr:`~type.__qualname__` being set to the location where pickle will be able
to find the class. For example, if the class was made available in class to find the class. For example, if the class was made available in class
SomeData in the global scope:: SomeData in the global scope::

View File

@ -335,7 +335,7 @@ E is more specialized than C, even if it is in a higher level.
A lazy programmer can obtain the MRO directly from Python 2.2, since in A lazy programmer can obtain the MRO directly from Python 2.2, since in
this case it coincides with the Python 2.3 linearization. It is enough this case it coincides with the Python 2.3 linearization. It is enough
to invoke the .mro() method of class A: to invoke the :meth:`~type.mro` method of class A:
>>> A.mro() # doctest: +NORMALIZE_WHITESPACE >>> A.mro() # doctest: +NORMALIZE_WHITESPACE
[<class 'A'>, <class 'B'>, <class 'E'>, [<class 'A'>, <class 'B'>, <class 'E'>,

View File

@ -99,7 +99,7 @@ a helper class :class:`ABC` to alternatively define ABCs through inheritance:
that you can customize the behavior of :func:`issubclass` further without the that you can customize the behavior of :func:`issubclass` further without the
need to call :meth:`register` on every class you want to consider a need to call :meth:`register` on every class you want to consider a
subclass of the ABC. (This class method is called from the subclass of the ABC. (This class method is called from the
:meth:`~class.__subclasscheck__` method of the ABC.) :meth:`~type.__subclasscheck__` method of the ABC.)
This method should return ``True``, ``False`` or :data:`NotImplemented`. If This method should return ``True``, ``False`` or :data:`NotImplemented`. If
it returns ``True``, the *subclass* is considered a subclass of this ABC. it returns ``True``, the *subclass* is considered a subclass of this ABC.
@ -149,7 +149,7 @@ a helper class :class:`ABC` to alternatively define ABCs through inheritance:
The :meth:`__subclasshook__` class method defined here says that any class The :meth:`__subclasshook__` class method defined here says that any class
that has an :meth:`~iterator.__iter__` method in its that has an :meth:`~iterator.__iter__` method in its
:attr:`~object.__dict__` (or in that of one of its base classes, accessed :attr:`~object.__dict__` (or in that of one of its base classes, accessed
via the :attr:`~class.__mro__` list) is considered a ``MyIterable`` too. via the :attr:`~type.__mro__` list) is considered a ``MyIterable`` too.
Finally, the last line makes ``Foo`` a virtual subclass of ``MyIterable``, Finally, the last line makes ``Foo`` a virtual subclass of ``MyIterable``,
even though it does not define an :meth:`~iterator.__iter__` method (it uses even though it does not define an :meth:`~iterator.__iter__` method (it uses

View File

@ -874,8 +874,8 @@ they add the ability to access fields by name instead of position index.
``(1, 2)``, then ``x`` will be a required argument, ``y`` will default to ``(1, 2)``, then ``x`` will be a required argument, ``y`` will default to
``1``, and ``z`` will default to ``2``. ``1``, and ``z`` will default to ``2``.
If *module* is defined, the ``__module__`` attribute of the named tuple is If *module* is defined, the :attr:`~type.__module__` attribute of the
set to that value. named tuple is set to that value.
Named tuple instances do not have per-instance dictionaries, so they are Named tuple instances do not have per-instance dictionaries, so they are
lightweight and require no more memory than regular tuples. lightweight and require no more memory than regular tuples.

View File

@ -58,11 +58,12 @@
* the type itself (``typ``) * the type itself (``typ``)
* the type's fully qualified name (``typ.__module__ + '.' + * the type's fully qualified name (``typ.__module__ + '.' +
typ.__qualname__``). typ.__qualname__``).
* the type's qualname (``typ.__qualname__``) * the type's :attr:`qualname <type.__qualname__>` (``typ.__qualname__``)
* the type's name (``typ.__name__``). * the type's :attr:`name <type.__name__>` (``typ.__name__``).
If none of the above match, repeat all of the checks above for each of If none of the above match, repeat all of the checks above for each of
the types in the :term:`MRO` (``typ.__mro__``). Finally, if no other key the types in the :term:`MRO` (:attr:`typ.__mro__ <type.__mro__>`).
Finally, if no other key
yields a handler, check for a handler for the key ``None``. If there is yields a handler, check for a handler for the key ``None``. If there is
no handler for ``None``, raise a :exc:`KeyError` for the fully no handler for ``None``, raise a :exc:`KeyError` for the fully
qualified name of the type. qualified name of the type.

View File

@ -317,7 +317,7 @@ variant, :attr:`~.BaseHeader.max_count` is set to 1.
class. When *use_default_map* is ``True`` (the default), the standard class. When *use_default_map* is ``True`` (the default), the standard
mapping of header names to classes is copied in to the registry during mapping of header names to classes is copied in to the registry during
initialization. *base_class* is always the last class in the generated initialization. *base_class* is always the last class in the generated
class's ``__bases__`` list. class's :class:`~type.__bases__` list.
The default mappings are: The default mappings are:

View File

@ -283,9 +283,11 @@ are always available. They are listed here in alphabetical order.
:func:`property`. :func:`property`.
.. versionchanged:: 3.10 .. versionchanged:: 3.10
Class methods now inherit the method attributes (``__module__``, Class methods now inherit the method attributes
``__name__``, ``__qualname__``, ``__doc__`` and ``__annotations__``) and (:attr:`~function.__module__`, :attr:`~function.__name__`,
have a new ``__wrapped__`` attribute. :attr:`~function.__qualname__`, :attr:`~function.__doc__` and
:attr:`~function.__annotations__`) and have a new ``__wrapped__``
attribute.
.. deprecated-removed:: 3.11 3.13 .. deprecated-removed:: 3.11 3.13
Class methods can no longer wrap other :term:`descriptors <descriptor>` such as Class methods can no longer wrap other :term:`descriptors <descriptor>` such as
@ -1286,8 +1288,9 @@ are always available. They are listed here in alphabetical order.
.. note:: .. note::
:class:`object` does *not* have a :attr:`~object.__dict__`, so you can't :class:`object` instances do *not* have :attr:`~object.__dict__`
assign arbitrary attributes to an instance of the :class:`object` class. attributes, so you can't assign arbitrary attributes to an instance of
:class:`object`.
.. function:: oct(x) .. function:: oct(x)
@ -1907,10 +1910,11 @@ are always available. They are listed here in alphabetical order.
For more information on static methods, see :ref:`types`. For more information on static methods, see :ref:`types`.
.. versionchanged:: 3.10 .. versionchanged:: 3.10
Static methods now inherit the method attributes (``__module__``, Static methods now inherit the method attributes
``__name__``, ``__qualname__``, ``__doc__`` and ``__annotations__``), (:attr:`~function.__module__`, :attr:`~function.__name__`,
have a new ``__wrapped__`` attribute, and are now callable as regular :attr:`~function.__qualname__`, :attr:`~function.__doc__` and
functions. :attr:`~function.__annotations__`), have a new ``__wrapped__`` attribute,
and are now callable as regular functions.
.. index:: .. index::
@ -1961,11 +1965,11 @@ are always available. They are listed here in alphabetical order.
to be searched. The search starts from the class right after the to be searched. The search starts from the class right after the
*type*. *type*.
For example, if :attr:`~class.__mro__` of *object_or_type* is For example, if :attr:`~type.__mro__` of *object_or_type* is
``D -> B -> C -> A -> object`` and the value of *type* is ``B``, ``D -> B -> C -> A -> object`` and the value of *type* is ``B``,
then :func:`super` searches ``C -> A -> object``. then :func:`super` searches ``C -> A -> object``.
The :attr:`~class.__mro__` attribute of the class corresponding to The :attr:`~type.__mro__` attribute of the class corresponding to
*object_or_type* lists the method resolution search order used by both *object_or_type* lists the method resolution search order used by both
:func:`getattr` and :func:`super`. The attribute is dynamic and can change :func:`getattr` and :func:`super`. The attribute is dynamic and can change
whenever the inheritance hierarchy is updated. whenever the inheritance hierarchy is updated.
@ -2044,28 +2048,30 @@ are always available. They are listed here in alphabetical order.
With one argument, return the type of an *object*. The return value is a With one argument, return the type of an *object*. The return value is a
type object and generally the same object as returned by type object and generally the same object as returned by
:attr:`object.__class__ <instance.__class__>`. :attr:`object.__class__`.
The :func:`isinstance` built-in function is recommended for testing the type The :func:`isinstance` built-in function is recommended for testing the type
of an object, because it takes subclasses into account. of an object, because it takes subclasses into account.
With three arguments, return a new type object. This is essentially a With three arguments, return a new type object. This is essentially a
dynamic form of the :keyword:`class` statement. The *name* string is dynamic form of the :keyword:`class` statement. The *name* string is
the class name and becomes the :attr:`~definition.__name__` attribute. the class name and becomes the :attr:`~type.__name__` attribute.
The *bases* tuple contains the base classes and becomes the The *bases* tuple contains the base classes and becomes the
:attr:`~class.__bases__` attribute; if empty, :class:`object`, the :attr:`~type.__bases__` attribute; if empty, :class:`object`, the
ultimate base of all classes, is added. The *dict* dictionary contains ultimate base of all classes, is added. The *dict* dictionary contains
attribute and method definitions for the class body; it may be copied attribute and method definitions for the class body; it may be copied
or wrapped before becoming the :attr:`~object.__dict__` attribute. or wrapped before becoming the :attr:`~type.__dict__` attribute.
The following two statements create identical :class:`type` objects: The following two statements create identical :class:`!type` objects:
>>> class X: >>> class X:
... a = 1 ... a = 1
... ...
>>> X = type('X', (), dict(a=1)) >>> X = type('X', (), dict(a=1))
See also :ref:`bltin-type-objects`. See also:
* :ref:`Documentation on attributes and methods on classes <class-attrs-and-methods>`.
* :ref:`bltin-type-objects`
Keyword arguments provided to the three argument form are passed to the Keyword arguments provided to the three argument form are passed to the
appropriate metaclass machinery (usually :meth:`~object.__init_subclass__`) appropriate metaclass machinery (usually :meth:`~object.__init_subclass__`)
@ -2075,18 +2081,18 @@ are always available. They are listed here in alphabetical order.
See also :ref:`class-customization`. See also :ref:`class-customization`.
.. versionchanged:: 3.6 .. versionchanged:: 3.6
Subclasses of :class:`type` which don't override ``type.__new__`` may no Subclasses of :class:`!type` which don't override ``type.__new__`` may no
longer use the one-argument form to get the type of an object. longer use the one-argument form to get the type of an object.
.. function:: vars() .. function:: vars()
vars(object) vars(object)
Return the :attr:`~object.__dict__` attribute for a module, class, instance, Return the :attr:`~object.__dict__` attribute for a module, class, instance,
or any other object with a :attr:`~object.__dict__` attribute. or any other object with a :attr:`!__dict__` attribute.
Objects such as modules and instances have an updateable :attr:`~object.__dict__` Objects such as modules and instances have an updateable :attr:`~object.__dict__`
attribute; however, other objects may have write restrictions on their attribute; however, other objects may have write restrictions on their
:attr:`~object.__dict__` attributes (for example, classes use a :attr:`!__dict__` attributes (for example, classes use a
:class:`types.MappingProxyType` to prevent direct dictionary updates). :class:`types.MappingProxyType` to prevent direct dictionary updates).
Without an argument, :func:`vars` acts like :func:`locals`. Without an argument, :func:`vars` acts like :func:`locals`.

View File

@ -646,10 +646,11 @@ The :mod:`functools` module defines the following functions:
attributes of the wrapper function are updated with the corresponding attributes attributes of the wrapper function are updated with the corresponding attributes
from the original function. The default values for these arguments are the from the original function. The default values for these arguments are the
module level constants ``WRAPPER_ASSIGNMENTS`` (which assigns to the wrapper module level constants ``WRAPPER_ASSIGNMENTS`` (which assigns to the wrapper
function's ``__module__``, ``__name__``, ``__qualname__``, ``__annotations__``, function's :attr:`~function.__module__`, :attr:`~function.__name__`,
``__type_params__``, and ``__doc__``, the documentation string) :attr:`~function.__qualname__`, :attr:`~function.__annotations__`,
and ``WRAPPER_UPDATES`` (which :attr:`~function.__type_params__`, and :attr:`~function.__doc__`, the
updates the wrapper function's ``__dict__``, i.e. the instance dictionary). documentation string) and ``WRAPPER_UPDATES`` (which updates the wrapper
function's :attr:`~function.__dict__`, i.e. the instance dictionary).
To allow access to the original function for introspection and other purposes To allow access to the original function for introspection and other purposes
(e.g. bypassing a caching decorator such as :func:`lru_cache`), this function (e.g. bypassing a caching decorator such as :func:`lru_cache`), this function
@ -670,7 +671,7 @@ The :mod:`functools` module defines the following functions:
.. versionchanged:: 3.2 .. versionchanged:: 3.2
The ``__wrapped__`` attribute is now automatically added. The ``__wrapped__`` attribute is now automatically added.
The ``__annotations__`` attribute is now copied by default. The :attr:`~function.__annotations__` attribute is now copied by default.
Missing attributes no longer trigger an :exc:`AttributeError`. Missing attributes no longer trigger an :exc:`AttributeError`.
.. versionchanged:: 3.4 .. versionchanged:: 3.4
@ -679,7 +680,7 @@ The :mod:`functools` module defines the following functions:
(see :issue:`17482`) (see :issue:`17482`)
.. versionchanged:: 3.12 .. versionchanged:: 3.12
The ``__type_params__`` attribute is now copied by default. The :attr:`~function.__type_params__` attribute is now copied by default.
.. decorator:: wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES) .. decorator:: wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)
@ -741,9 +742,10 @@ have three read-only attributes:
The keyword arguments that will be supplied when the :class:`partial` object is The keyword arguments that will be supplied when the :class:`partial` object is
called. called.
:class:`partial` objects are like :class:`function` objects in that they are :class:`partial` objects are like :ref:`function objects <user-defined-funcs>`
callable, weak referenceable, and can have attributes. There are some important in that they are callable, weak referenceable, and can have attributes.
differences. For instance, the :attr:`~definition.__name__` and :attr:`__doc__` attributes There are some important differences. For instance, the
:attr:`~function.__name__` and :attr:`function.__doc__` attributes
are not created automatically. Also, :class:`partial` objects defined in are not created automatically. Also, :class:`partial` objects defined in
classes behave like static methods and do not transform into bound methods classes behave like static methods and do not transform into bound methods
during instance attribute look-up. during instance attribute look-up.

View File

@ -545,7 +545,7 @@ attributes (see :ref:`import-mod-attrs` for module attributes):
has a :meth:`~object.__get__` method, but not a :meth:`~object.__set__` has a :meth:`~object.__get__` method, but not a :meth:`~object.__set__`
method or a :meth:`~object.__delete__` method. Beyond that, the set of method or a :meth:`~object.__delete__` method. Beyond that, the set of
attributes varies. A :attr:`~definition.__name__` attribute is usually attributes varies. A :attr:`~definition.__name__` attribute is usually
sensible, and :attr:`!__doc__` often is. sensible, and :attr:`~definition.__doc__` often is.
Methods implemented via descriptors that also pass one of the other tests Methods implemented via descriptors that also pass one of the other tests
return ``False`` from the :func:`ismethoddescriptor` test, simply because the return ``False`` from the :func:`ismethoddescriptor` test, simply because the

View File

@ -304,7 +304,8 @@ in a module, ``__name__`` is the module's name in the Python package namespace.
parameter mirrors the equivalent one in the :mod:`warnings` module. parameter mirrors the equivalent one in the :mod:`warnings` module.
The fourth keyword argument is *extra* which can be used to pass a The fourth keyword argument is *extra* which can be used to pass a
dictionary which is used to populate the __dict__ of the :class:`LogRecord` dictionary which is used to populate the :attr:`~object.__dict__` of the
:class:`LogRecord`
created for the logging event with user-defined attributes. These custom created for the logging event with user-defined attributes. These custom
attributes can then be used as you like. For example, they could be attributes can then be used as you like. For example, they could be
incorporated into logged messages. For example:: incorporated into logged messages. For example::

View File

@ -21,7 +21,7 @@ modules. The documentation can be presented as pages of text on the console,
served to a web browser, or saved to HTML files. served to a web browser, or saved to HTML files.
For modules, classes, functions and methods, the displayed documentation is For modules, classes, functions and methods, the displayed documentation is
derived from the docstring (i.e. the :attr:`!__doc__` attribute) of the object, derived from the docstring (i.e. the :attr:`~definition.__doc__` attribute) of the object,
and recursively of its documentable members. If there is no docstring, and recursively of its documentable members. If there is no docstring,
:mod:`!pydoc` tries to obtain a description from the block of comment lines just :mod:`!pydoc` tries to obtain a description from the block of comment lines just
above the definition of the class, function or method in the source file, or at above the definition of the class, function or method in the source file, or at

View File

@ -5521,22 +5521,6 @@ types, where they are relevant. Some of these are not reported by the
:func:`dir` built-in function. :func:`dir` built-in function.
.. attribute:: object.__dict__
A dictionary or other mapping object used to store an object's (writable)
attributes.
.. attribute:: instance.__class__
The class to which a class instance belongs.
.. attribute:: class.__bases__
The tuple of base classes of a class object.
.. attribute:: definition.__name__ .. attribute:: definition.__name__
The name of the class, function, method, descriptor, or The name of the class, function, method, descriptor, or
@ -5551,44 +5535,25 @@ types, where they are relevant. Some of these are not reported by the
.. versionadded:: 3.3 .. versionadded:: 3.3
.. attribute:: definition.__module__
The name of the module in which a class or function was defined.
.. attribute:: definition.__doc__
The documentation string of a class or function, or ``None`` if undefined.
.. attribute:: definition.__type_params__ .. attribute:: definition.__type_params__
The :ref:`type parameters <type-params>` of generic classes, functions, The :ref:`type parameters <type-params>` of generic classes, functions,
and :ref:`type aliases <type-aliases>`. and :ref:`type aliases <type-aliases>`. For classes and functions that
are not generic, this will be an empty tuple.
.. versionadded:: 3.12 .. versionadded:: 3.12
.. attribute:: class.__mro__
This attribute is a tuple of classes that are considered when looking for
base classes during method resolution.
.. method:: class.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:`~class.__mro__`.
.. method:: class.__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::
>>> int.__subclasses__()
[<class 'bool'>, <enum 'IntEnum'>, <flag 'IntFlag'>, <class 're._constants._NamedIntConstant'>]
.. attribute:: class.__static_attributes__
A tuple containing names of attributes of this class which are accessed
through ``self.X`` from any function in its body.
.. versionadded:: 3.13
.. _int_max_str_digits: .. _int_max_str_digits:
Integer string conversion length limitation Integer string conversion length limitation

View File

@ -946,7 +946,7 @@ The :mod:`test.support` module defines the following functions:
other modules, possibly a C backend (like ``csv`` and its ``_csv``). other modules, possibly a C backend (like ``csv`` and its ``_csv``).
The *extra* argument can be a set of names that wouldn't otherwise be automatically The *extra* argument can be a set of names that wouldn't otherwise be automatically
detected as "public", like objects without a proper ``__module__`` detected as "public", like objects without a proper :attr:`~definition.__module__`
attribute. If provided, it will be added to the automatically detected ones. attribute. If provided, it will be added to the automatically detected ones.
The *not_exported* argument can be a set of names that must not be treated The *not_exported* argument can be a set of names that must not be treated

View File

@ -91,8 +91,8 @@ Dynamic Type Creation
For classes that have an ``__orig_bases__`` attribute, this For classes that have an ``__orig_bases__`` attribute, this
function returns the value of ``cls.__orig_bases__``. function returns the value of ``cls.__orig_bases__``.
For classes without the ``__orig_bases__`` attribute, ``cls.__bases__`` is For classes without the ``__orig_bases__`` attribute,
returned. :attr:`cls.__bases__ <type.__bases__>` is returned.
Examples:: Examples::
@ -392,7 +392,7 @@ Standard names are defined for the following types:
In addition, when a class is defined with a :attr:`~object.__slots__` attribute, then for In addition, when a class is defined with a :attr:`~object.__slots__` attribute, then for
each slot, an instance of :class:`!MemberDescriptorType` will be added as an attribute each slot, an instance of :class:`!MemberDescriptorType` will be added as an attribute
on the class. This allows the slot to appear in the class's :attr:`~object.__dict__`. on the class. This allows the slot to appear in the class's :attr:`~type.__dict__`.
.. impl-detail:: .. impl-detail::

View File

@ -3269,7 +3269,8 @@ Introspection helpers
empty dictionary is returned. empty dictionary is returned.
* If *obj* is a class ``C``, the function returns a dictionary that merges * If *obj* is a class ``C``, the function returns a dictionary that merges
annotations from ``C``'s base classes with those on ``C`` directly. This annotations from ``C``'s base classes with those on ``C`` directly. This
is done by traversing ``C.__mro__`` and iteratively combining is done by traversing :attr:`C.__mro__ <type.__mro__>` and iteratively
combining
``__annotations__`` dictionaries. Annotations on classes appearing ``__annotations__`` dictionaries. Annotations on classes appearing
earlier in the :term:`method resolution order` always take precedence over earlier in the :term:`method resolution order` always take precedence over
annotations on classes appearing later in the method resolution order. annotations on classes appearing later in the method resolution order.

View File

@ -239,7 +239,7 @@ the *new_callable* argument to :func:`patch`.
Accessing any attribute not in this list will raise an :exc:`AttributeError`. Accessing any attribute not in this list will raise an :exc:`AttributeError`.
If *spec* is an object (rather than a list of strings) then If *spec* is an object (rather than a list of strings) then
:attr:`~instance.__class__` returns the class of the spec object. This :attr:`~object.__class__` returns the class of the spec object. This
allows mocks to pass :func:`isinstance` tests. allows mocks to pass :func:`isinstance` tests.
* *spec_set*: A stricter variant of *spec*. If used, attempting to *set* * *spec_set*: A stricter variant of *spec*. If used, attempting to *set*

View File

@ -1416,7 +1416,7 @@ dictionary. The class name is bound to this class object in the original local
namespace. namespace.
The order in which attributes are defined in the class body is preserved The order in which attributes are defined in the class body is preserved
in the new class's ``__dict__``. Note that this is reliable only right in the new class's :attr:`~type.__dict__`. Note that this is reliable only right
after the class is created and only for classes that were defined using after the class is created and only for classes that were defined using
the definition syntax. the definition syntax.
@ -1447,8 +1447,8 @@ decorators. The result is then bound to the class name.
A list of :ref:`type parameters <type-params>` may be given in square brackets A list of :ref:`type parameters <type-params>` may be given in square brackets
immediately after the class's name. immediately after the class's name.
This indicates to static type checkers that the class is generic. At runtime, This indicates to static type checkers that the class is generic. At runtime,
the type parameters can be retrieved from the class's ``__type_params__`` the type parameters can be retrieved from the class's
attribute. See :ref:`generic-classes` for more. :attr:`~type.__type_params__` attribute. See :ref:`generic-classes` for more.
.. versionchanged:: 3.12 .. versionchanged:: 3.12
Type parameter lists are new in Python 3.12. Type parameter lists are new in Python 3.12.
@ -1661,8 +1661,8 @@ with more precision. The scope of type parameters is modeled with a special
function (technically, an :ref:`annotation scope <annotation-scopes>`) that function (technically, an :ref:`annotation scope <annotation-scopes>`) that
wraps the creation of the generic object. wraps the creation of the generic object.
Generic functions, classes, and type aliases have a :attr:`!__type_params__` Generic functions, classes, and type aliases have a
attribute listing their type parameters. :attr:`~definition.__type_params__` attribute listing their type parameters.
Type parameters come in three kinds: Type parameters come in three kinds:
@ -1924,5 +1924,5 @@ all annotations are instead stored as strings::
therefore the function's :term:`docstring`. therefore the function's :term:`docstring`.
.. [#] A string literal appearing as the first statement in the class body is .. [#] A string literal appearing as the first statement in the class body is
transformed into the namespace's ``__doc__`` item and therefore the class's transformed into the namespace's :attr:`~type.__doc__` item and therefore
:term:`docstring`. the class's :term:`docstring`.

View File

@ -595,7 +595,6 @@ Most of these attributes check the type of the assigned value:
* - .. attribute:: function.__doc__ * - .. attribute:: function.__doc__
- The function's documentation string, or ``None`` if unavailable. - The function's documentation string, or ``None`` if unavailable.
Not inherited by subclasses.
* - .. attribute:: function.__name__ * - .. attribute:: function.__name__
- The function's name. - The function's name.
@ -942,6 +941,8 @@ namespace as a dictionary object.
or keep the module around while using its dictionary directly. or keep the module around while using its dictionary directly.
.. _class-attrs-and-methods:
Custom classes Custom classes
-------------- --------------
@ -984,6 +985,9 @@ of a base class.
A class object can be called (see above) to yield a class instance (see below). A class object can be called (see above) to yield a class instance (see below).
Special attributes
^^^^^^^^^^^^^^^^^^
.. index:: .. index::
single: __name__ (class attribute) single: __name__ (class attribute)
single: __module__ (class attribute) single: __module__ (class attribute)
@ -996,66 +1000,115 @@ A class object can be called (see above) to yield a class instance (see below).
single: __static_attributes__ (class attribute) single: __static_attributes__ (class attribute)
single: __firstlineno__ (class attribute) single: __firstlineno__ (class attribute)
Special attributes: .. list-table::
:header-rows: 1
:attr:`~definition.__name__` * - Attribute
The class name. - Meaning
:attr:`__module__` * - .. attribute:: type.__name__
The name of the module in which the class was defined. - The class's name.
See also: :attr:`__name__ attributes <definition.__name__>`.
:attr:`~object.__dict__` * - .. attribute:: type.__qualname__
The dictionary containing the class's namespace. - The class's :term:`qualified name`.
See also: :attr:`__qualname__ attributes <definition.__qualname__>`.
:attr:`~class.__bases__` * - .. attribute:: type.__module__
A tuple containing the base classes, in the order of - The name of the module in which the class was defined.
their occurrence in the base class list.
:attr:`__doc__` * - .. attribute:: type.__dict__
The class's documentation string, or ``None`` if undefined. - A :class:`mapping proxy <types.MappingProxyType>`
providing a read-only view of the class's namespace.
See also: :attr:`__dict__ attributes <object.__dict__>`.
:attr:`~object.__annotations__` * - .. attribute:: type.__bases__
A dictionary containing - A :class:`tuple` containing the class's bases.
:term:`variable annotations <variable annotation>` In most cases, for a class defined as ``class X(A, B, C)``,
collected during class body execution. For best practices on ``X.__bases__`` will be exactly equal to ``(A, B, C)``.
working with :attr:`~object.__annotations__`, please see
:mod:`annotationlib`.
.. warning:: * - .. attribute:: type.__doc__
- The class's documentation string, or ``None`` if undefined.
Not inherited by subclasses.
Accessing the :attr:`~object.__annotations__` attribute of a class * - .. attribute:: type.__annotations__
object directly may yield incorrect results in the presence of - A dictionary containing
metaclasses. Use :func:`annotationlib.get_annotations` to :term:`variable annotations <variable annotation>`
retrieve class annotations safely. collected during class body execution. See also:
:attr:`__annotations__ attributes <object.__annotations__>`.
.. versionchanged:: 3.14 For best practices on working with :attr:`~object.__annotations__`,
Annotations are now :ref:`lazily evaluated <lazy-evaluation>`. please see :mod:`annotationlib`.
See :pep:`649`.
:attr:`~object.__annotate__` .. caution::
The :term:`annotate function` for this class, or ``None``
if the class has no annotations. See :attr:`object.__annotate__`.
.. warning:: Accessing the :attr:`!__annotations__` attribute of a class
object directly may yield incorrect results in the presence of
metaclasses. Use :func:`annotationlib.get_annotations` to
retrieve class annotations safely.
Accessing the :attr:`~object.__annotate__` attribute of a class .. versionchanged:: 3.14
object directly may yield incorrect results in the presence of Annotations are now :ref:`lazily evaluated <lazy-evaluation>`.
metaclasses. Use :func:`annotationlib.get_annotate_function` to See :pep:`649`.
retrieve the annotate function safely.
.. versionadded:: 3.14 * - .. 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__>`.
:attr:`__type_params__` .. caution::
A tuple containing the :ref:`type parameters <type-params>` of
a :ref:`generic class <generic-classes>`.
:attr:`~class.__static_attributes__` Accessing the :attr:`!__annotate__` attribute of a class
A tuple containing names of attributes of this class which are assigned object directly may yield incorrect results in the presence of
through ``self.X`` from any function in its body. metaclasses. Use :func:`annotationlib.get_annotate_function` to
retrieve the annotate function safely.
:attr:`__firstlineno__` .. versionadded:: 3.14
The line number of the first line of the class definition, including decorators.
* - .. 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.
.. 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::
>>> int.__subclasses__()
[<class 'bool'>, <enum 'IntEnum'>, <flag 'IntFlag'>, <class 're._constants._NamedIntConstant'>, <class 're._ZeroSentinel'>]
Class instances Class instances
--------------- ---------------
@ -1095,12 +1148,22 @@ dictionary directly.
Class instances can pretend to be numbers, sequences, or mappings if they have Class instances can pretend to be numbers, sequences, or mappings if they have
methods with certain special names. See section :ref:`specialnames`. methods with certain special names. See section :ref:`specialnames`.
Special attributes
^^^^^^^^^^^^^^^^^^
.. index:: .. index::
single: __dict__ (instance attribute) single: __dict__ (instance attribute)
single: __class__ (instance attribute) single: __class__ (instance attribute)
Special attributes: :attr:`~object.__dict__` is the attribute dictionary; .. attribute:: object.__class__
:attr:`~instance.__class__` is the instance's 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) I/O objects (also known as file objects)
@ -2330,9 +2393,9 @@ Notes on using *__slots__*:
* The action of a *__slots__* declaration is not limited to the class * The action of a *__slots__* declaration is not limited to the class
where it is defined. *__slots__* declared in parents are available in where it is defined. *__slots__* declared in parents are available in
child classes. However, child subclasses will get a :attr:`~object.__dict__` and child classes. However, instances of a child subclass will get a
*__weakref__* unless they also define *__slots__* (which should only :attr:`~object.__dict__` and *__weakref__* unless the subclass also defines
contain names of any *additional* slots). *__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 * 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 defined by the base class slot is inaccessible (except by retrieving its
@ -2351,7 +2414,7 @@ Notes on using *__slots__*:
to provide per-attribute docstrings that will be recognised by to provide per-attribute docstrings that will be recognised by
:func:`inspect.getdoc` and displayed in the output of :func:`help`. :func:`inspect.getdoc` and displayed in the output of :func:`help`.
* :attr:`~instance.__class__` assignment works only if both classes have the * :attr:`~object.__class__` assignment works only if both classes have the
same *__slots__*. same *__slots__*.
* :ref:`Multiple inheritance <tut-multiple>` with multiple slotted parent * :ref:`Multiple inheritance <tut-multiple>` with multiple slotted parent
@ -2617,7 +2680,7 @@ in the local namespace as the defined class.
When a new class is created by ``type.__new__``, the object provided as the 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 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 object is discarded. The new copy is wrapped in a read-only proxy, which
becomes the :attr:`~object.__dict__` attribute of the class object. becomes the :attr:`~type.__dict__` attribute of the class object.
.. seealso:: .. seealso::
@ -2645,14 +2708,14 @@ 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 classes" to any class or type (including built-in types), including other
ABCs. ABCs.
.. method:: class.__instancecheck__(self, instance) .. method:: type.__instancecheck__(self, instance)
Return true if *instance* should be considered a (direct or indirect) Return true if *instance* should be considered a (direct or indirect)
instance of *class*. If defined, called to implement ``isinstance(instance, instance of *class*. If defined, called to implement ``isinstance(instance,
class)``. class)``.
.. method:: class.__subclasscheck__(self, subclass) .. method:: type.__subclasscheck__(self, subclass)
Return true if *subclass* should be considered a (direct or indirect) Return true if *subclass* should be considered a (direct or indirect)
subclass of *class*. If defined, called to implement ``issubclass(subclass, subclass of *class*. If defined, called to implement ``issubclass(subclass,
@ -2668,8 +2731,8 @@ case the instance is itself a class.
:pep:`3119` - Introducing Abstract Base Classes :pep:`3119` - Introducing Abstract Base Classes
Includes the specification for customizing :func:`isinstance` and Includes the specification for customizing :func:`isinstance` and
:func:`issubclass` behavior through :meth:`~class.__instancecheck__` and :func:`issubclass` behavior through :meth:`~type.__instancecheck__` and
:meth:`~class.__subclasscheck__`, with motivation for this functionality :meth:`~type.__subclasscheck__`, with motivation for this functionality
in the context of adding Abstract Base Classes (see the :mod:`abc` in the context of adding Abstract Base Classes (see the :mod:`abc`
module) to the language. module) to the language.

View File

@ -226,8 +226,8 @@ Annotation scopes differ from function scopes in the following ways:
statements in inner scopes. This includes only type parameters, as no other statements in inner scopes. This includes only type parameters, as no other
syntactic elements that can appear within annotation scopes can introduce new names. syntactic elements that can appear within annotation scopes can introduce new names.
* While annotation scopes have an internal name, that name is not reflected in the * While annotation scopes have an internal name, that name is not reflected in the
:term:`__qualname__ <qualified name>` of objects defined within the scope. :term:`qualified name` of objects defined within the scope.
Instead, the :attr:`!__qualname__` Instead, the :attr:`~definition.__qualname__`
of such objects is as if the object were defined in the enclosing scope. of such objects is as if the object were defined in the enclosing scope.
.. versionadded:: 3.12 .. versionadded:: 3.12

View File

@ -104,8 +104,8 @@ identifier is used but only the following private identifiers are mangled:
- Any name used as the name of a variable that is assigned or read or any - Any name used as the name of a variable that is assigned or read or any
name of an attribute being accessed. name of an attribute being accessed.
The ``__name__`` attribute of nested functions, classes, and type aliases The :attr:`~definition.__name__` attribute of nested functions, classes, and
is however not mangled. type aliases is however not mangled.
- The name of imported modules, e.g., ``__spam`` in ``import __spam``. - The name of imported modules, e.g., ``__spam`` in ``import __spam``.
If the module is part of a package (i.e., its name contains a dot), If the module is part of a package (i.e., its name contains a dot),

View File

@ -276,8 +276,8 @@ definition looked like this::
then ``MyClass.i`` and ``MyClass.f`` are valid attribute references, returning then ``MyClass.i`` and ``MyClass.f`` are valid attribute references, returning
an integer and a function object, respectively. Class attributes can also be an integer and a function object, respectively. Class attributes can also be
assigned to, so you can change the value of ``MyClass.i`` by assignment. assigned to, so you can change the value of ``MyClass.i`` by assignment.
:attr:`!__doc__` is also a valid attribute, returning the docstring belonging to :attr:`~type.__doc__` is also a valid attribute, returning the docstring
the class: ``"A simple example class"``. belonging to the class: ``"A simple example class"``.
Class *instantiation* uses function notation. Just pretend that the class Class *instantiation* uses function notation. Just pretend that the class
object is a parameterless function that returns a new instance of the class. object is a parameterless function that returns a new instance of the class.
@ -932,6 +932,6 @@ Examples::
.. [#] Except for one thing. Module objects have a secret read-only attribute called .. [#] Except for one thing. Module objects have a secret read-only attribute called
:attr:`~object.__dict__` which returns the dictionary used to implement the module's :attr:`~object.__dict__` which returns the dictionary used to implement the module's
namespace; the name :attr:`~object.__dict__` is an attribute but not a global name. namespace; the name ``__dict__`` is an attribute but not a global name.
Obviously, using this violates the abstraction of namespace implementation, and Obviously, using this violates the abstraction of namespace implementation, and
should be restricted to things like post-mortem debuggers. should be restricted to things like post-mortem debuggers.

View File

@ -443,8 +443,8 @@ Python syntax::
f.grammar = "A ::= B (C D)*" f.grammar = "A ::= B (C D)*"
The dictionary containing attributes can be accessed as the function's The dictionary containing attributes can be accessed as the function's
:attr:`~object.__dict__`. Unlike the :attr:`~object.__dict__` attribute of class instances, in :attr:`~function.__dict__`. Unlike the :attr:`~type.__dict__` attribute of class instances, in
functions you can actually assign a new dictionary to :attr:`~object.__dict__`, though functions you can actually assign a new dictionary to :attr:`~function.__dict__`, though
the new value is restricted to a regular Python dictionary; you *can't* be the new value is restricted to a regular Python dictionary; you *can't* be
tricky and set it to a :class:`!UserDict` instance, or any other random object tricky and set it to a :class:`!UserDict` instance, or any other random object
that behaves like a mapping. that behaves like a mapping.

View File

@ -171,7 +171,7 @@ attributes of their own:
* :attr:`~definition.__name__` is the attribute's name. * :attr:`~definition.__name__` is the attribute's name.
* :attr:`!__doc__` is the attribute's docstring. * :attr:`~definition.__doc__` is the attribute's docstring.
* ``__get__(object)`` is a method that retrieves the attribute value from * ``__get__(object)`` is a method that retrieves the attribute value from
*object*. *object*.
@ -186,7 +186,8 @@ are::
descriptor = obj.__class__.x descriptor = obj.__class__.x
descriptor.__get__(obj) descriptor.__get__(obj)
For methods, :meth:`!descriptor.__get__` returns a temporary object that's For methods, :meth:`descriptor.__get__ <object.__get__>` returns a temporary
object that's
callable, and wraps up the instance and the method to be called on it. This is callable, and wraps up the instance and the method to be called on it. This is
also why static methods and class methods are now possible; they have also why static methods and class methods are now possible; they have
descriptors that wrap up just the method, or the method and the class. As a descriptors that wrap up just the method, or the method and the class. As a

View File

@ -1113,10 +1113,10 @@ Here are all of the changes that Python 2.3 makes to the core Python language.
<type '_socket.socket'> <type '_socket.socket'>
* One of the noted incompatibilities between old- and new-style classes has been * One of the noted incompatibilities between old- and new-style classes has been
removed: you can now assign to the :attr:`~definition.__name__` and :attr:`~class.__bases__` removed: you can now assign to the :attr:`~type.__name__` and :attr:`~type.__bases__`
attributes of new-style classes. There are some restrictions on what can be attributes of new-style classes. There are some restrictions on what can be
assigned to :attr:`~class.__bases__` along the lines of those relating to assigning to assigned to :attr:`!__bases__` along the lines of those relating to assigning to
an instance's :attr:`~instance.__class__` attribute. an instance's :attr:`~object.__class__` attribute.
.. ====================================================================== .. ======================================================================
@ -1925,8 +1925,8 @@ Changes to Python's build process and to the C API include:
dependence on a system version or local installation of Expat. dependence on a system version or local installation of Expat.
* If you dynamically allocate type objects in your extension, you should be * If you dynamically allocate type objects in your extension, you should be
aware of a change in the rules relating to the :attr:`!__module__` and aware of a change in the rules relating to the :attr:`~type.__module__` and
:attr:`~definition.__name__` attributes. In summary, you will want to ensure the type's :attr:`~type.__name__` attributes. In summary, you will want to ensure the type's
dictionary contains a ``'__module__'`` key; making the module name the part of dictionary contains a ``'__module__'`` key; making the module name the part of
the type name leading up to the final period will no longer have the desired the type name leading up to the final period will no longer have the desired
effect. For more detail, read the API reference documentation or the source. effect. For more detail, read the API reference documentation or the source.

View File

@ -1887,7 +1887,7 @@ New Features
The :c:macro:`Py_TPFLAGS_MANAGED_DICT` and :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` The :c:macro:`Py_TPFLAGS_MANAGED_DICT` and :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF`
flags have been added. This allows extensions classes to support object flags have been added. This allows extensions classes to support object
``__dict__`` and weakrefs with less bookkeeping, :attr:`~object.__dict__` and weakrefs with less bookkeeping,
using less memory and with faster access. using less memory and with faster access.
* API for performing calls using * API for performing calls using
@ -2006,7 +2006,7 @@ Porting to Python 3.12
internal-only field directly. internal-only field directly.
To get a list of subclasses, call the Python method To get a list of subclasses, call the Python method
:py:meth:`~class.__subclasses__` (using :c:func:`PyObject_CallMethod`, :py:meth:`~type.__subclasses__` (using :c:func:`PyObject_CallMethod`,
for example). for example).
* Add support of more formatting options (left aligning, octals, uppercase * Add support of more formatting options (left aligning, octals, uppercase
@ -2025,7 +2025,7 @@ Porting to Python 3.12
:c:func:`PyUnicode_FromFormatV`. :c:func:`PyUnicode_FromFormatV`.
(Contributed by Philip Georgi in :gh:`95504`.) (Contributed by Philip Georgi in :gh:`95504`.)
* Extension classes wanting to add a ``__dict__`` or weak reference slot * Extension classes wanting to add a :attr:`~object.__dict__` or weak reference slot
should use :c:macro:`Py_TPFLAGS_MANAGED_DICT` and should use :c:macro:`Py_TPFLAGS_MANAGED_DICT` and
:c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` instead of ``tp_dictoffset`` and :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` instead of ``tp_dictoffset`` and
``tp_weaklistoffset``, respectively. ``tp_weaklistoffset``, respectively.

View File

@ -121,9 +121,10 @@ Interpreter improvements:
Python data model improvements: Python data model improvements:
* :attr:`~class.__static_attributes__` stores the names of attributes accessed * :attr:`~type.__static_attributes__` stores the names of attributes accessed
through ``self.X`` in any function in a class body. through ``self.X`` in any function in a class body.
* :attr:`!__firstlineno__` records the first line number of a class definition. * :attr:`~type.__firstlineno__` records the first line number of a class
definition.
Significant improvements in the standard library: Significant improvements in the standard library:
@ -588,7 +589,7 @@ Other Language Changes
(Contributed by Levi Sabah, Zackery Spytz and Hugo van Kemenade (Contributed by Levi Sabah, Zackery Spytz and Hugo van Kemenade
in :gh:`73965`.) in :gh:`73965`.)
* Classes have a new :attr:`~class.__static_attributes__` attribute. * Classes have a new :attr:`~type.__static_attributes__` attribute.
This is populated by the compiler with a tuple of the class's attribute names This is populated by the compiler with a tuple of the class's attribute names
which are assigned through ``self.<name>`` from any function in its body. which are assigned through ``self.<name>`` from any function in its body.
(Contributed by Irit Katriel in :gh:`115775`.) (Contributed by Irit Katriel in :gh:`115775`.)
@ -2191,13 +2192,13 @@ New Features
* Add the :c:func:`PyType_GetFullyQualifiedName` function * Add the :c:func:`PyType_GetFullyQualifiedName` function
to get the type's fully qualified name. to get the type's fully qualified name.
The module name is prepended if ``type.__module__`` is a string The module name is prepended if :attr:`type.__module__` is
and is not equal to either ``'builtins'`` or ``'__main__'``. a string and is not equal to either ``'builtins'`` or ``'__main__'``.
(Contributed by Victor Stinner in :gh:`111696`.) (Contributed by Victor Stinner in :gh:`111696`.)
* Add the :c:func:`PyType_GetModuleName` function * Add the :c:func:`PyType_GetModuleName` function
to get the type's module name. to get the type's module name. This is equivalent to getting the
This is equivalent to getting the ``type.__module__`` attribute. :attr:`type.__module__` attribute.
(Contributed by Eric Snow and Victor Stinner in :gh:`111696`.) (Contributed by Eric Snow and Victor Stinner in :gh:`111696`.)
* Add the :c:func:`PyUnicode_EqualToUTF8AndSize` * Add the :c:func:`PyUnicode_EqualToUTF8AndSize`

View File

@ -549,9 +549,11 @@ separation of binary and text data).
PEP 3155: Qualified name for classes and functions PEP 3155: Qualified name for classes and functions
================================================== ==================================================
Functions and class objects have a new ``__qualname__`` attribute representing Functions and class objects have a new :attr:`~definition.__qualname__`
attribute representing
the "path" from the module top-level to their definition. For global functions the "path" from the module top-level to their definition. For global functions
and classes, this is the same as ``__name__``. For other functions and classes, and classes, this is the same as :attr:`~definition.__name__`.
For other functions and classes,
it provides better information about where they were actually defined, and it provides better information about where they were actually defined, and
how they might be accessible from the global scope. how they might be accessible from the global scope.

View File

@ -2526,9 +2526,9 @@ Changes in the C API
to format the :func:`repr` of the object. to format the :func:`repr` of the object.
(Contributed by Serhiy Storchaka in :issue:`22453`.) (Contributed by Serhiy Storchaka in :issue:`22453`.)
* Because the lack of the :attr:`__module__` attribute breaks pickling and * Because the lack of the :attr:`~type.__module__` attribute breaks pickling and
introspection, a deprecation warning is now raised for builtin types without introspection, a deprecation warning is now raised for builtin types without
the :attr:`__module__` attribute. This would be an AttributeError in the :attr:`~type.__module__` attribute. This will be an :exc:`AttributeError` in
the future. the future.
(Contributed by Serhiy Storchaka in :issue:`20204`.) (Contributed by Serhiy Storchaka in :issue:`20204`.)

View File

@ -549,7 +549,7 @@ PEP 520: Preserving Class Attribute Definition Order
Attributes in a class definition body have a natural ordering: the same Attributes in a class definition body have a natural ordering: the same
order in which the names appear in the source. This order is now order in which the names appear in the source. This order is now
preserved in the new class's :attr:`~object.__dict__` attribute. preserved in the new class's :attr:`~type.__dict__` attribute.
Also, the effective default class *execution* namespace (returned from Also, the effective default class *execution* namespace (returned from
:ref:`type.__prepare__() <prepare>`) is now an insertion-order-preserving :ref:`type.__prepare__() <prepare>`) is now an insertion-order-preserving
@ -934,7 +934,7 @@ asynchronous generators.
The :func:`~collections.namedtuple` function now accepts an optional The :func:`~collections.namedtuple` function now accepts an optional
keyword argument *module*, which, when specified, is used for keyword argument *module*, which, when specified, is used for
the ``__module__`` attribute of the returned named tuple class. the :attr:`~type.__module__` attribute of the returned named tuple class.
(Contributed by Raymond Hettinger in :issue:`17941`.) (Contributed by Raymond Hettinger in :issue:`17941`.)
The *verbose* and *rename* arguments for The *verbose* and *rename* arguments for

View File

@ -637,7 +637,8 @@ pydoc
----- -----
The documentation string is now shown not only for class, function, The documentation string is now shown not only for class, function,
method etc, but for any object that has its own ``__doc__`` attribute. method etc, but for any object that has its own :attr:`~definition.__doc__`
attribute.
(Contributed by Serhiy Storchaka in :issue:`40257`.) (Contributed by Serhiy Storchaka in :issue:`40257`.)
random random

View File

@ -1 +1 @@
Add only fields which are modified via self.* to :attr:`~class.__static_attributes__`. Add only fields which are modified via self.* to :attr:`~type.__static_attributes__`.