From e6fa6af0ab6d0c141e17de4b56847ae016f5b70e Mon Sep 17 00:00:00 2001 From: "Aaron Hall, MBA" Date: Thu, 25 May 2017 22:33:26 -0700 Subject: [PATCH] bpo-30449 Terse slots (GH-1819) * correct __slots__ documentation with minimal changes * add multiple inheritance info * remove mapping from description (cherry picked from commit 2b44e302ec3079363c4d5c875677945953705c58) Co-authored-by: Aaron Hall, MBA --- Doc/reference/datamodel.rst | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 773eeb23354016..c95f4a97093037 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1653,15 +1653,11 @@ instances cannot override the behavior of a property. __slots__ ^^^^^^^^^ -By default, instances of classes have a dictionary for attribute storage. This -wastes space for objects having very few instance variables. The space -consumption can become acute when creating large numbers of instances. - -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. +*__slots__* allow us to explicitly declare data members (like +properties) and deny the creation of *__dict__* and *__weakref__* +(unless explicitly declared in *__slots__* or available in a parent.) +The space saved over using *__dict__* can be significant. .. data:: object.__slots__ @@ -1674,9 +1670,8 @@ saved because *__dict__* is not created for each instance. Notes on using *__slots__* """""""""""""""""""""""""" -* When inheriting from a class without *__slots__*, the *__dict__* attribute of - that class will always be accessible, so a *__slots__* definition in the - subclass is meaningless. +* When inheriting from a class without *__slots__*, the *__dict__* and + *__weakref__* attribute of the instances will always be accessible. * Without a *__dict__* variable, instances cannot be assigned new variables not 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 assignment. -* The action of a *__slots__* declaration is limited to the class where it is - defined. As a result, subclasses will have a *__dict__* unless they also define - *__slots__* (which must only contain names of any *additional* slots). +* 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, 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 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__*. +* 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: pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy