mirror of
https://github.com/python/cpython.git
synced 2025-09-27 10:50:04 +00:00
bpo-30449: Improve __slots__ documentation (GH-1819)
(cherry picked from commit 2b44e302ec
)
Co-authored-by: Aaron Hall, MBA <aaronchall@yahoo.com>
This commit is contained in:
parent
d8e7b98b17
commit
6eab93cfe5
1 changed files with 15 additions and 14 deletions
|
@ -1653,15 +1653,11 @@ instances cannot override the behavior of a property.
|
||||||
__slots__
|
__slots__
|
||||||
^^^^^^^^^
|
^^^^^^^^^
|
||||||
|
|
||||||
By default, instances of classes have a dictionary for attribute storage. This
|
*__slots__* allow us to explicitly declare data members (like
|
||||||
wastes space for objects having very few instance variables. The space
|
properties) and deny the creation of *__dict__* and *__weakref__*
|
||||||
consumption can become acute when creating large numbers of instances.
|
(unless explicitly declared in *__slots__* or available in a parent.)
|
||||||
|
|
||||||
The default can be overridden by defining *__slots__* in a class definition.
|
|
||||||
The *__slots__* declaration takes a sequence of instance variables and reserves
|
|
||||||
just enough space in each instance to hold a value for each variable. Space is
|
|
||||||
saved because *__dict__* is not created for each instance.
|
|
||||||
|
|
||||||
|
The space saved over using *__dict__* can be significant.
|
||||||
|
|
||||||
.. data:: object.__slots__
|
.. data:: object.__slots__
|
||||||
|
|
||||||
|
@ -1674,9 +1670,8 @@ saved because *__dict__* is not created for each instance.
|
||||||
Notes on using *__slots__*
|
Notes on using *__slots__*
|
||||||
""""""""""""""""""""""""""
|
""""""""""""""""""""""""""
|
||||||
|
|
||||||
* When inheriting from a class without *__slots__*, the *__dict__* attribute of
|
* When inheriting from a class without *__slots__*, the *__dict__* and
|
||||||
that class will always be accessible, so a *__slots__* definition in the
|
*__weakref__* attribute of the instances will always be accessible.
|
||||||
subclass is meaningless.
|
|
||||||
|
|
||||||
* Without a *__dict__* variable, instances cannot be assigned new variables not
|
* Without a *__dict__* variable, instances cannot be assigned new variables not
|
||||||
listed in the *__slots__* definition. Attempts to assign to an unlisted
|
listed in the *__slots__* definition. Attempts to assign to an unlisted
|
||||||
|
@ -1695,9 +1690,11 @@ Notes on using *__slots__*
|
||||||
*__slots__*; otherwise, the class attribute would overwrite the descriptor
|
*__slots__*; otherwise, the class attribute would overwrite the descriptor
|
||||||
assignment.
|
assignment.
|
||||||
|
|
||||||
* The action of a *__slots__* declaration is limited to the class where it is
|
* The action of a *__slots__* declaration is not limited to the class
|
||||||
defined. As a result, subclasses will have a *__dict__* unless they also define
|
where it is defined. *__slots__* declared in parents are available in
|
||||||
*__slots__* (which must only contain names of any *additional* slots).
|
child classes. However, child subclasses will get a *__dict__* and
|
||||||
|
*__weakref__* unless they also define *__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
|
||||||
|
@ -1713,6 +1710,10 @@ Notes on using *__slots__*
|
||||||
|
|
||||||
* *__class__* assignment works only if both classes have the same *__slots__*.
|
* *__class__* assignment works only if both classes have the same *__slots__*.
|
||||||
|
|
||||||
|
* 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`.
|
||||||
|
|
||||||
.. _class-customization:
|
.. _class-customization:
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue