Style question - defining immutable class data members
John Posner
jjposner at snet.net
Wed Mar 25 21:36:47 EDT 2009
On Mon Mar 16 03:42:42, I said:
> RTFM, in section "Augmented assignment statements" of python301.chm:
>
> ---
> For targets which are attribute references, the initial value is retrieved
> with a getattr() and the result is assigned with a setattr(). Notice that
the
> two methods do not necessarily refer to the same variable. When getattr()
> refers to a class variable, 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
> ---
>
> So, this case is closed ... almost. I believe a similar explanation, with
a
> similar example, should appear in the preceding/parent section,
"Assignment
> statements". Here's my proposed example:
>
> class A:
> x = 3 # class variable
> a = A()
> a.x = a.x + 1 # a.x on RHS gets value of class variable (3)
> # a.x on LHS creates instance variable with
> value of RHS expression (4)
Following is a draft of my proposed addendum to the "Assignment statements"
section of the Python documentation (for both Python 2 and Python 3). I've
included reStructured Text markup. The first paragraph is what's already in
the documentation. Everything else is mine:
* If the target is an attribute reference: The primary expression in
the reference is evaluated. It should yield an object with
assignable attributes; if this is not the case, TypeError is raised.
That object is then asked to assign the assigned object to the given
attribute; if it cannot perform the assignment, it raises an
exception (usually but not necessarily AttributeError).
If the object is a class instance and the attribute reference occurs
on both sides of the assignment operator; for example::
self.x = self.x + 1
... in the RHS expression, ``self.x`` is evaluated with
``getattr()``, which can access either an instance attribute or (if
no instance attribute exists) a class attribute. The LHS target
``self.x`` is assigned with ``setattr()``, which *always* accesses
an instance attribute, creating it if necessary. Thus, the two
occurrences of ``self.x`` do not necessarily refer to the same
variable. If the RHS expression refers to a class attribute, the LHS
creates a new instance attribute as the target of the assignment.
See section "Augmented assignment statements" for a similar note on
attribute references.
If anyone would like to suggest changes to this write-up, have at it. I plan
to submit a SourceForge issue within a day or so.
(BTW, I searched through the existing issues, to see if it has already been
reported. AFAIK, it hasn't. But #4246 is a cousin, referencing
UnboundLocalError exceptions.
-John
E-mail message checked by Spyware Doctor (6.0.0.386)
Database version: 5.12040
http://www.pctools.com/en/spyware-doctor-antivirus/
More information about the Python-list
mailing list