Commit f4e6b98b authored by Georg Brandl's avatar Georg Brandl

#5621: refactor description of how class/instance attributes interact on a.x=a.x+1 or augassign.

parent 83130c39
...@@ -151,11 +151,30 @@ Assignment of an object to a single target is recursively defined as follows. ...@@ -151,11 +151,30 @@ Assignment of an object to a single target is recursively defined as follows.
* If the target is an attribute reference: The primary expression in the * If the target is an attribute reference: The primary expression in the
reference is evaluated. It should yield an object with assignable attributes; reference is evaluated. It should yield an object with assignable attributes;
if this is not the case, :exc:`TypeError` is raised. That object is then asked if this is not the case, :exc:`TypeError` is raised. That object is then
to assign the assigned object to the given attribute; if it cannot perform the asked to assign the assigned object to the given attribute; if it cannot
assignment, it raises an exception (usually but not necessarily perform the assignment, it raises an exception (usually but not necessarily
:exc:`AttributeError`). :exc:`AttributeError`).
.. _attr-target-note:
Note: If the object is a class instance and the attribute reference occurs on
both sides of the assignment operator, the RHS expression, ``a.x`` can access
either an instance attribute or (if no instance attribute exists) a class
attribute. The LHS target ``a.x`` is always set as an instance attribute,
creating it if necessary. Thus, the two occurrences of ``a.x`` do not
necessarily refer to the same attribute: if the RHS expression refers to a
class attribute, the LHS creates a new instance attribute as the target of the
assignment::
class Cls:
x = 3 # class variable
inst = Cls()
inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 3
This description does not necessarily apply to descriptor attributes, such as
properties created with :func:`property`.
.. index:: .. index::
pair: subscription; assignment pair: subscription; assignment
object: mutable object: mutable
...@@ -253,16 +272,8 @@ same way as normal assignments. Similarly, with the exception of the possible ...@@ -253,16 +272,8 @@ same way as normal assignments. Similarly, with the exception of the possible
*in-place* behavior, the binary operation performed by augmented assignment is *in-place* behavior, the binary operation performed by augmented assignment is
the same as the normal binary operations. the same as the normal binary operations.
For targets which are attribute references, the initial value is retrieved with For targets which are attribute references, the same :ref:`caveat about class
a :meth:`getattr` and the result is assigned with a :meth:`setattr`. Notice and instance attributes <attr-target-note>` applies as for regular assignments.
that the two methods do not necessarily refer to the same variable. When
:meth:`getattr` refers to a class variable, :meth:`setattr` still writes to an
instance variable. For example::
class A:
x = 3 # class variable
a = A()
a.x += 1 # writes a.x as 4 leaving A.x as 3
.. _assert: .. _assert:
......
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