Class Variable Access and Assignment

Magnus Lycka lycka at carmen.se
Fri Nov 4 13:46:01 CET 2005


Antoon Pardon wrote:
> Would it be too much to ask that in a line like.
> 
>   x = x + 1.
> 
> both x's would resolve to the same namespace?

They always do Antoon. There is no such issue for
local (or global) varibles. The issue has to do
with c.x = c.x + 1. In this case it's clearly
designed and documented that this corresponds to:

setattr(c, 'x', getattr(c, 'x') + 1)

The result of these operations depends on e.g.
how the __setattr__ and __getattr__ methods in
the class in question are defined.

You need to understand that the dot-operaterator
always involves a lookup-operation that can be
implemented in various ways.

It's well defined that you can do things like:

 >>> class Counter:
...     c=0
...     def __call__(self):
...         self.c+=1
...     def __str__(self):
...         return str(self.c)
...
 >>> c=Counter()
 >>> c()
 >>> print c
1
 >>> c()
 >>> print c
2
 >>> class C5(Counter):
...     c=5
...
 >>> c5=C5()
 >>> c5()
 >>> print c5
6

Of course, you could design a language, say Pythoon
or Parthon, where this is illegal, and you force the
programmer to do something longer such as:

 >>> class APCounter:
...     c=0
...     def __init__(self):
...         self.c = self.__class__.c
...     def __call__(self):
...         self.c+=1
...     def __str__(self):
...         return str(self.c)
...

I don't see this as an improvement though...



More information about the Python-list mailing list