[EMAIL PROTECTED] wrote:
> Hi.
>
> I've got a question on the differences and how to define static and
> class variables. AFAIK, class methods are the ones which receives the
> class itself as an argument, while static methods are the one which
> runs statically with the defining class.
>
> Hence, my understanding is that static variables must be bound to the
> class defining the variables and shared by children of parent class
> where the variable is defined. But, please have a look at this code in
> which a guy told me that the variable a is static:
>
>   
>>>> class Foo:
>>>>         
>       a = 1
>       @classmethod
>       def increment(cls):
>               cls.a += 1
>               print cls.a
>   
In your increment() method, you do this:

cls.a += 1

It does the following thing:

#1. read cls.a
#2. add one
#3. assign this value to cls.a

In point #3, you really bind a name to a value. As you probably know, in 
Python, there are names and objects. The initial value of the name 'a' 
is 1. It is an immutable object. The "+=" operator usually increments a 
value of an object. However, because the 'int' type is immutable, the += 
operator will rather rebind this variable to a newly created value. I 
believe this is what is happening here. Your question "is variable a 
static or class variable?" has no real answer. After running the 
increment() method on a descendant class, e.g. Child1 will rebind the 
name Child1.a, creating a new name in the namespace of the class. So the 
variable Foo.a is still there, but you are accessing Child1.a instead.

If you want to HANDLE a as a static variable, you can handle it with a 
static method. That won't bind a new name in the descendant class. 
(However, you can still rebind it, e.g. "Child.a=42")


Now here is a good question: how do you handle a variable as static, 
from a class (not static) method? Here is an example:

 >>> class Foo(object):
...     a = 1
...     @classmethod
...     def increment(cls):
...             Foo.a += 1
...             print cls.a
...
 >>> class Child1(Foo):
...     pass
...
 >>> Child1.increment()
2
 >>> Child1.increment()
3
 >>> Foo.a
3
 >>> Child1.a = 10
 >>> Child1.increment()
10
 >>> Child1.increment()
10
 >>> Child1.increment()
10
 >>> Foo.a
6
 >>>



However, the question is: why would you do this? :-)

BTW you should use new style classes whenever it is possible. Old style 
classes will have gone...

Hope this helps,

   Laszlo

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to