]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] Programming FAQ: Mention object.__setattr__ as a technique for delegation...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Thu, 26 Sep 2024 20:55:08 +0000 (22:55 +0200)
committerGitHub <noreply@github.com>
Thu, 26 Sep 2024 20:55:08 +0000 (13:55 -0700)
Programming FAQ: Mention object.__setattr__ as a technique for delegation (GH-124617)

This is used for example by threading.local in the stdlib.
(cherry picked from commit 43979fad904bcc343f90cb526faa526c45fcbfa4)

Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
Doc/faq/programming.rst

index 4a6f1ca57d89e3e76291ebd7b3da3d1639e8e0f3..fa7b22bde1dc6f46a113a018669a0b98bbaad3b9 100644 (file)
@@ -1613,9 +1613,16 @@ method too, and it must do so carefully.  The basic implementation of
            self.__dict__[name] = value
        ...
 
-Most :meth:`!__setattr__` implementations must modify
-:attr:`self.__dict__ <object.__dict__>` to store
-local state for self without causing an infinite recursion.
+Many :meth:`~object.__setattr__` implementations call :meth:`!object.__setattr__` to set
+an attribute on self without causing infinite recursion::
+
+   class X:
+       def __setattr__(self, name, value):
+           # Custom logic here...
+           object.__setattr__(self, name, value)
+
+Alternatively, it is possible to set attributes by inserting
+entries into :attr:`self.__dict__ <object.__dict__>` directly.
 
 
 How do I call a method defined in a base class from a derived class that extends it?