On Thursday, August 30, 2012 3:25:52 PM UTC+2, Hans Mulder wrote: > On 30/08/12 14:34:51, Marco Nawijn wrote: > > > > > Note that if you change 'd' it will change for all instances! > > > > That depends on how you change it. > > > > >>>> bobj = A() > > >>>> bobj.d > > > 'my attribute' > > > > > >>>> A.d = 'oops...attribute changed' > > > > Here you change the attribute on the class. > > That will affect all instances: > > > > >>>> aobj.d > > > 'oops...attribute changed' > > > > > >>>> bobj.d > > > 'oops...attribute changed' > > > > You can also set the attribute on an instance: > > > > >>> bobj.d = 'For bobj only' > > >>> bobj.d > > 'For bobj only' > > >>>> aobj.d > > > 'oops...attribute changed' > > > > So, if you specifically change it on one instance, thenit won't > > change on other instances of the same class. > > > > > If you want attributes to be local to the instance, you have > > > to define them in the __init__ section of the class like this: > > > > That's a good idea, but it's not required. You can set them > > later, as shown above. > > > > > > > class A(object): > > > > > > def __init__(self): > > > d = 'my attribute' > > > > That will just set the global variable d. > > You want to set the instance attribute: > > > > self.d = 'my attribute' > > > > >>>> aobj = A() > > >>>> bobj = A() > > > > > >>>> aobj.d > > > 'my attribute' > > > > Note that aobj.d will not find the global variable d, > > if neither the instance, nor the class nor any of the > > base classes have that attribute. > > > > I don't know where this 'my attribute' comes from, but > > it's not the instance attribute you tried to set in the > > __init__ method. Maybe your class A still has a class > > attribute with that value from an earlier experiment. > > > > > > Hope this helps, > > > > -- HansM
Learned my lesson today. Don't assume you know something. Test it first ;). I have done quite some programming in Python, but did not know that class attributes are still local to the instances. It is also a little surprising I must say. I always considered them like static variables in C++ (not that I am an expert in C++). I knew of course that you don't have to define a local attribute in the __init__ method of a class, but I consider it good style and since the OP is a self claimed newbie I left out the other option. The missing "self" in the code below was a typo class A(object): def __init__(self): d = 'my attribute' # should be self.d Regards, Marco -- http://mail.python.org/mailman/listinfo/python-list