Style question - defining immutable class data members

Steve Holden steve at holdenweb.com
Wed Mar 25 23:27:44 EDT 2009


John Posner wrote:
> 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 

Is this true in the case of read-write properties? This seems a little
simplistic for what's actually a pretty complex piece of logic.

>     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.
> 
regards
 Steve
-- 
Steve Holden           +1 571 484 6266   +1 800 494 3119
Holden Web LLC                 http://www.holdenweb.com/
Want to know? Come to PyCon - soon! http://us.pycon.org/




More information about the Python-list mailing list