Class Variable Access and Assignment
Bengt Richter
bokr at oz.net
Fri Nov 4 21:11:51 EST 2005
On 4 Nov 2005 11:09:36 GMT, Antoon Pardon <apardon at forel.vub.ac.be> wrote:
[...]
>
>Take the code:
>
> lst[f()] += 1
>
>Now let f be a function with a side effect, that in succession
>produces the positive integers starting with one.
>
>What do you think this should be equivallent to:
>
> t = f()
> lst[t] = lst[t] + 1
>
>or
>
> lst[f()] = lst[f()] + 1
>
>If you think the environment can change between references then I
>suppose you prefer the second approach.
>
I am quite sympathetic to your probe of python semantics, but I
don't think the above is an argument that should be translated
to attribute assignment. BTW, ISTM that augassign (+=) is
a red herring here, since it's easy to make a shared class variable
that is augassigned apparently as you want, e.g.,
>>> class shared(object):
... def __init__(self, v=0): self.v=v
... def __get__(self, *any): return self.v
... def __set__(self, _, v): self.v = v
...
>>> class B(object):
... a = shared(1)
...
>>> b=B()
>>> b.a
1
>>> B.a
1
>>> b.a += 2
>>> b.a
3
>>> B.a
3
>>> vars(b)
{}
>>> vars(b)['a'] = 'instance attr'
>>> vars(b)
{'a': 'instance attr'}
>>> b.a
3
>>> b.a += 100
>>> b.a
103
>>> B.a
103
>>> B.a = 'this could be prevented'
>>> b.a
'instance attr'
>>> B.a
'this could be prevented'
The spelled out attribute update works too
>>> B.a = shared('alpha')
>>> b.a
'alpha'
>>> b.a = b.a + ' beta'
>>> b.a
'alpha beta'
>>> B.a
'alpha beta'
But the instance attribute we forced is still there
>>> vars(b)
{'a': 'instance attr'}
You could have shared define __add__ and __iadd__ and __radd__ also,
for confusion to taste ;-)
Regards,
Bengt Richter
More information about the Python-list
mailing list