diff options
author | Aaron Hall, MBA <aaronchall@yahoo.com> | 2017-05-26 05:33:26 (GMT) |
---|---|---|
committer | Raymond Hettinger <rhettinger@users.noreply.github.com> | 2017-05-26 05:33:26 (GMT) |
commit | 2b44e302ec3079363c4d5c875677945953705c58 (patch) | |
tree | 2c274eb2f2b51d838cdba1519dd8cbb34ff02111 /Doc | |
parent | 368cf1d20630498ca7939069a05d744fabb570aa (diff) | |
download | cpython-2b44e302ec3079363c4d5c875677945953705c58.zip cpython-2b44e302ec3079363c4d5c875677945953705c58.tar.gz cpython-2b44e302ec3079363c4d5c875677945953705c58.tar.bz2 |
bpo-30449 Terse slots (#1819)
* correct __slots__ documentation with minimal changes
* add multiple inheritance info
* remove mapping from description
Diffstat (limited to 'Doc')
-rw-r--r-- | Doc/reference/datamodel.rst | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 600a71a..9708688 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1614,15 +1614,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__ @@ -1635,9 +1631,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 @@ -1656,9 +1651,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 @@ -1674,6 +1671,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: |