Kaydet (Commit) 6eab93cf authored tarafından Miss Islington (bot)'s avatar Miss Islington (bot) Kaydeden (comit) Mariatta

bpo-30449: Improve __slots__ documentation (GH-1819)

(cherry picked from commit 2b44e302)
Co-authored-by: 's avatarAaron Hall, MBA <aaronchall@yahoo.com>
üst d8e7b98b
...@@ -1653,15 +1653,11 @@ instances cannot override the behavior of a property. ...@@ -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. ...@@ -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__* ...@@ -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__* ...@@ -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:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment